[C#] Connection string w SQL Server

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?

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

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

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;