ConnectionString - uniwersalność jak zrobić

0

Hej!
Mam aplikację, która łączy się z lokalną bazą danych i na jej podstawie dokonuje operacji. Wszystko ładnie działa na obecnym komputerze. Jednak po wrzuceniu na drugi, dodaniu bazy w sql servere, wywala błąd : Nie odnaleziono serwera.
Niestety localhost nie załatwia sprawy w moim ConnectionString:

SqlConnection conn= new SqlConnection(@"Data Source=localhost;Initial Catalog=moja_baza;Integrated Security=True"); 

Gdy próbuje wpisać zamiast localhost na obecnym komputerze nazwa_komputera/nazwa_instancji to otrzymuje dokładnie taki sam błąd.

Co robię źle? Czy da się wykryć za pomocą C# nazwę serwera i instancji, tak żeby program sam ją pobierał i później wczytał do ConnectionStringa?

0

Trzymaj connection stringi w configu aplikacji i tam podmieniaj ich wartość w zależności od komputera.

0

A czy jest możliwe i miałoby sens stworzenie listy z instancjami, aby użytkownik wybierał tą, która posiada tą bazę? Jeśli miałbym zrobić to w konfiguracji to jest możliwość wyciągnięcia tego z systemu w miarę prosty sposób?

0

A czy w wartości Data Source w twoim connection stringu nie powinno być czegoś takiego:
(localhost)\instancja serwera ? np.:
SqlConnection conn= new SqlConnection(@"Data Source=(localhost)\SQLEXPRESS;Initial Catalog=moja_baza;Integrated Security=True");

Poza tym wydaje mi się, że tworzenie programu, który łączy się z lokalną bazą danych i działa na wielu komputerach raczej mija się z celem. Bardziej sensowny byłby program łączący się ze zdalną bazą i działający na wielu maszynach.

0

Niestety moja wiedza (raczej jej brak) zdecydowały aby zrobić najpierw program łączący się z lokalną bazą. Aplikacja generuje raporty i wyświetla różne wyniki i to wszystko. Jak wstawiłem .//MSSQLSERVER w ConnectionString to niestety już nie chce działać, jak podaję samo localhost lub nazwę serwera "Dell-I" to wtedy działa.

Zdalne postawienie bazy rozumiem, że wymaga wykupienie jakiegoś miejsca na jakimś serwerze? Baza ma parę mb, więc nie jest to jakaś krowa (10-20 tabel około).

0

Jak chcesz za darmo to trzeba mieć serwer (fizyczny, lub wirtualka, zależy od wymogów), zainstalować na nim system i bazę danych, skonfigurować oba. Ustawić odpowiedni connectionstring w aplikacji.

Nie wiem co to za typ aplikacji, czy web-owa czy desktop-owa ? W przypadku web-owej możesz wykupić jakiś hosting z ASP.NET lub skorzystać z darmowych (chyba jakieś tam są, ale nie spodziewaj się rewelacji). W przypadku desktop-owej raczej zostaje Ci wersja z instalacją na serwerze w lokalnej sieci.

0

Jest to zwykła apka WinForms. Chciałbym jak najbardziej to uprościć, bo odbiorca tej aplikacji musi wtedy sam to konfigurować. Może poszukam jakiegoś darmowego serwera i spróbuje to zrobić. Bo postawienie własnego na wirtualce nie rozwiązuje problemu dostępu- wyłączonym komp i kaput.

Chciałbym znaleźć darmowy bo potrzebuję tej aplikacji jako dodatek do prezentacji i serwer na 3 mieś byłby wystarczający.

0

Skoro potrzebujesz tylko na prezentację to możesz postawić na lokalnej bazie danych, czy nie ?

Odnośnie uproszczenia - może rozwiązaniem byłoby stworzenie dialogu do wprowadzenia danych połączenia, tutaj wprowadzałoby się ustawienia i te byłyby zapisywane do pliku/rejestru (nie zapomnij szyfrować haseł), następnie podczas włączania appki plik/rejestr byłby odczytywany, wyświetlałoby się okienko do wyboru konfiguracji, użytkownik wybiera połączenie, po wybraniu konkretnego połączenia budowany byłby connectionstring do bazy danych i wykonywane połączenie.

0

Zastanawiam się czy na pewno to dobrze rozumiem. Czy w DataSource powinienem podawać tylko nazwę serwera czy nazwę instancji też?
Zapytanie

SELECT @@SERVERNAME, @@SERVICENAME

zwraca mi
Dell-I (nazwa komputera), MSSQLSERVER

jak wpisuję W

 Data Source="Dell-I\\MSSQLSERVER"

to nie działa, a jak samo Dell-I to działa.

0

Proponuję sprawdzić tu:
http://www.connectionstrings.com/sql-server/

0

Może być lokalna baza. Od użytkownika wystarczyłoby abym poprosił dane logowania plus nazwę serwera/instancji i umożliwił, np. zapisywanie tych ustawień tak jak wspomniałeś do rejestru. Dodałbym po prostu formatkę, wyświetlaną przed wykonaniem zapytań.

Co do connection stringa, dalej nie jestem w stanie zrozumieć dlaczego sposób localhost, Dell-I działa, a jak dodam nazwę instancji MSSQLSERVER to już nie.

0

Server=myServerName\myInstanceName;Database=myDataBase;User Id=myUsername;
Password=myPassword;

Podstaw swoje dane i sprawdź czy działa.
Sprawdź za pomocą SSMS czy na pewno taką masz nazwę instancji.

I wrzuć jeszcze komunikat błędu.

0

Łącze się za pomocą autentykacji windows, a nie SQL.

mój ConnectionString:

SqlConnection con = new SqlConnection("Data Source=Dell-I//MSSQLSERVER;Initial Catalog=NORTHWIND;Integrated Security=True"); 

to samo dla:

SqlConnection con = new SqlConnection("Data Source=localhost//MSSQLSERVER;Initial Catalog=NORTHWIND;Integrated Security=True"); 

Błąd:

Wystąpił błąd związany z siecią lub wystąpieniem podczas ustanawiania połączenia z serwerem programu SQL Server. Nie można odnaleźć serwera lub jest on niedostępny. Sprawdź, czy nazwa wystąpienia jest poprawna i czy konfiguracja serwera programu SQL Server zezwala na połączenia zdalne. (provider: Named Pipes Provider, error: 40 - Nie można otworzyć połączenia z programem SQL Server)

0

OK, sprawdź:

  1. Czy baza danych jest uruchomiona, czy jesteś w stanie podłączyć się za pomocą SQL Server Management Studio,
  2. Czy firewall nie blokuje Ci portu 1433,
  3. Wejdź w konfigurację MSSQL-a i sprawdź czy masz włączony TCP/IP i czy jest ustawiony dla niego port 1433,
  4. Sprawdź czy nazwa Dell-I jest znana, najlepiej w cmd i ping Dell-I, zobacz czy dostajesz odpowiedzi.

Tyle co mogę wymyślić na tą chwilę.
Masz błąd 40, więc powyższe powinny pasować do Twojego problemu.

0

Wejdź w network configuration i pokaż, że masz włączony TCP/IP.
Pokaż konfigurację TCP/IP.

0
  1. Tak jak najbardziej
  2. Dodałem nową regule
  3. http://zapodaj.net/df46b130cac0f.jpg.html
  4. 0% strat, więc jest ok
0

Włącz jeszcze named pipes.
Komunikat mówi właśnie o named pipes, a są wyłączone, nie wiem jednak dlaczego nie używa TCP/IP.

0

W SQL Server Network Configuration (32bit) mam pusto.

0

Na tym ekranie: http://zapodaj.net/df46b130cac0f.jpg.html

Jest Named Pipes jako disabled, włącz to i spróbuj.

0

Tak zrobiłem, zrestartowałem serwer i dalej wyskakuje błąd w aplikacji.

0

Jeszcze jedno, zobacz, że w konfiguracji TCP/IP masz Active = true, ale Enabled = false. Powłączaj dla odpowiednich interfejsów, zobacz czy zadziała.

0

Niestety dalej nie działa. Trochę tego nie rozumiem, że dla samego Dell-I śmiga, a jak dopiszę /MSSQLSERVER to już nie. Tak samo jest w SQL Management Studio

0

Zaraz zaraz...

Podałem Ci:
Server=myServerName\myInstanceName;Database=myDataBase;User Id=myUsername;
Password=myPassword;

A Ty wpisujesz // czyli w drugą stronę "łamane", wpisz tak jak należy i sprawdź. Jak zadziała to przywróć starą konfigurację.

0

Wpisywałem poprawnie, źle umieściłem w poście. Niestety nie działają wersje ConnectionStringa dopisane z nazwą instancji. Tylko sam ServerName przechodzi

0

Spróbuj jeszcze po IP: 127.0.0.1 + po IP w sieci lokalnej czyli 127.0.0.1\MSSQLSERVER,
Szczerze mówiąc to ja tu nic nie widzę, jeżeli masz nadal błąd 40 to będzie to albo problem z rozwiązaniem nazwy albo problem z brakiem nasłuchu na IP:PORT albo problem z firewall-em.

Sprawdź czy nadal jest błąd 40.
Jeszcze jedną rzecz sprawdź, jak podłączysz się Management Studio to Server properties, Connections i tam będzie coś ala Allow remote connections czy coś takiego.

0

Wpisz jeszcze netstat -an w cmd i sprawdź czy jest nasłuchiwanie na IP:1433, zwłaszcza 127.0.0.1:1433 i LOCAL_IP:1433 (gdzie LOCAL_IP to Twój IP w sieci) albo *:1433 czyli wszystkie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1