Witam. Obecnie korzystam z bazy SQL Server hostowanej na dysku. Łączę się z nią poprzez standardową ścieżkę do pliku, np.:
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename='C:\Users\Documents\bazad.mdf';
Zamierzam aplikację, wykorzystującą wspomnianą bazę, uruchomić na innym komputerze, stąd chciałbym umieścić bazę w plikach aplikacji typu bin\Debug. Próbowałem już bezskutecznie np.
SqlConnection con = new SqlConnection(“Data Source=|DataDirectory|\bazad.mdf”)
Czy istnieje funkcja lokalizująca bazę, bez sztywno wpisanej ścieżki?
Z góry dziękuję za odpowiedź.
Local DB służy do developmentu. Na innej maszynie musisz mieć zainstalowany normalny SQL Server (może być darmowy Express). ConnectionString zależy od sposobu autentykacji. Tu masz przykłady - https://www.connectionstrings.com/sql-server/
Istnieją sposoby wyszukiwania serwerów w sieci, ale przecież nie będziesz tego robił w aplikacji (może to trwać nawet kilka minut). Tak - wskazuje się konkretny serwer.
Czy zatem jako lokalizację serwera, można wskazać foldery aplikacji (poprzez np. InitialCatalog bądź DataDirectory), w formie niepowiązanej ściśle ze ścieżką do pliku na dysku wewnętrznym (wpisywanej na sztywno ‘C:\ […]’)?
Obrazując, w folderze aplikacji ProjektAplikacji, zamierzam umieścić bazę (przyjmijmy) bazad.mdf. W proponowanym connection stringu wymagany jest serwer,
Attach a database file, located in the data directory, on connect to a local SQL Server Express instance
Server=.\SQLExpress;AttachDbFilename=|DataDirectory|mydbfile.mdf;Database=bazad;
Trusted_Connection=Yes;
jednak w rozumieniu
SqlConnection con = new SqlConnection(@“Server=.\SQLExpress;AttachDbFilename=|DataDirectory|bazad.mdf;Database=bazad;Trusted_Connection=Yes;”);
efektem jest error: 26 - Błąd podczas lokalizowania określonego serwera/wystąpienia. Istnieje w ogóle możliwość wyrażenia w podobny sposób ścieżki do bazy, czy też w przypadku SQL Server nie jest to możliwe?
Chcąc uniezależnić aplikację od serwera zewnętrznego (hostowanego na stronie internetowej bądź na dysku komputera), chciałbym się łączyć z bazą znajdującą się w plikach aplikacji. Przy następującej definicji (bezpośredni link do źródła najpewniej niewskazany), a zwłaszcza ostatnim cytowanym zdaniu:
|DataDirectory| (enclosed in pipe symbols) is a substitution string that indicates the path to the database. It eliminates the need to hard-code the full path which leads to several problems as the full path to the database could be serialized in different places. DataDirectory also makes it easy to share a project and also to deploy an application.
For example, instead of having the following connection string:
“Data Source= c:\program files\MyApp\Mydb.sdf”
Using DataDirectory, you can have the following connection string:
“Data Source = |DataDirectory|\Mydb.sdf”
To set the DataDirectory property, call the AppDomain.SetData method. If you do not set the DataDirectory property, the following default rules will be applied to access the database folder:
• For applications that are put in a folder on the user’s computer, the database folder uses the application folder.
przy użyciu DataDirectory, nie potrzebowałbym nawet wywoływać AppDomain.SetData. Jednak następujące próby:
kończą się niepowodzeniem (bazad.mdf znajduje się w folderze programu ProjektAplikacji). Czy brakuje tu odpowiedniej składni, czy też DataDirectory jest niewłaściwą metodą w tym przypadku? Zamierzałem podobnie konstruować connection stringa jak do statycznej, małej bazy SQLite, jednak metody tych dwóch baz w zakresie connection stringów niestety się “rozjeżdżają” (empirycznie sprawdzając)…
Napisz sobie jakiś kawałek kodu co zbuduje Ci odpowiedni connection string.
Do wykrycia lokalizacji gdzie aktualnie uruchomiona jest aplikacja możesz użyć np.