[C#] Connection string w SQL Server


(Savillan) #1

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ź.


(kowgli) #2

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.


(Savillan) #3

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?


(kowgli) #4

Mając normalny serwer nie wskazujesz pliku, tylko adres serwera i bazy.
Np.

Data Source=MOJ_KOMPUTER\sql2016;Initial Catalog=NAZWA_BAZY;Integrated Security=True


(Savillan) #5

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:

@“Data Source=|DataDirectory|\bazad.mdf”

oraz

@"Data Source=|DataDirectory|\bazad.mdf"
AppDomain.CurrentDomain.SetData(“DataDirectory”, “\ProjektAplikacji\”);

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)…


(fufus) #6

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.

string path = System.Reflection.Assembly.GetExecutingAssembly().Location;