Napotkałem ten sam błąd podczas korzystania z obiektów zarządzania serwerem (SMO) w vb.net (jestem pewien, że to to samo w C #)
Komentarz Techie Joe do pierwszego posta był przydatnym ostrzeżeniem, że w hostingu współdzielonym dzieje się wiele dodatkowych rzeczy. Zajęło trochę czasu, aby się zorientować, ale poniższy kod pokazuje, jak bardzo trzeba być bardzo szczegółowym w sposobie uzyskiwania dostępu do baz danych SQL. Wydawało się, że błąd „serwer główny ...” pojawiał się za każdym razem, gdy wywołania SMO nie były dokładnie określone we współdzielonym środowisku hostingu.
Ta pierwsza sekcja kodu dotyczyła lokalnego serwera SQL Express i opierała się na prostym uwierzytelnianiu systemu Windows. Cały kod użyty w tych przykładach jest oparty na samouczku SMO Roberta Kanasza w tym artykule w witrynie Code Project :
Dim conn2 = New ServerConnection()
conn2.ServerInstance = "<local pc name>\SQLEXPRESS"
Try
Dim testConnection As New Server(conn2)
Debug.WriteLine("Server: " + testConnection.Name)
Debug.WriteLine("Edition: " + testConnection.Information.Edition)
Debug.WriteLine(" ")
For Each db2 As Database In testConnection.Databases
Debug.Write(db2.Name & " - ")
For Each fg As FileGroup In db2.FileGroups
Debug.Write(fg.Name & " - ")
For Each df As DataFile In fg.Files
Debug.WriteLine(df.Name + " - " + df.FileName)
Next
Next
Next
conn2.Disconnect()
Catch err As Exception
Debug.WriteLine(err.Message)
End Try
Powyższy kod wyszukuje pliki .mdf dla każdej bazy danych na lokalnym serwerze SQLEXPRESS, ponieważ uwierzytelnianie jest obsługiwane przez system Windows i jest rozległe we wszystkich bazach danych.
W poniższym kodzie znajdują się 2 sekcje iterujące dla plików .mdf. W tym przypadku działa tylko pierwsza iteracja szukająca grupy plików i znajduje tylko jeden plik, ponieważ połączenie jest tylko z jedną bazą danych we współdzielonym środowisku hostingu.
Druga iteracja, która jest kopią iteracji, która działała powyżej, dławi się natychmiast, ponieważ sposób, w jaki jest napisany, próbuje uzyskać dostęp do pierwszej bazy danych we współdzielonym środowisku, które nie jest tym, do którego ma zastosowanie identyfikator użytkownika / hasło, więc serwer SQL zwraca błąd autoryzacji w postaci błędu „nazwa główna serwera ...”.
Dim sqlConnection1 As New System.Data.SqlClient.SqlConnection
sqlConnection1.ConnectionString = "connection string with User ID/Password to a specific database in a shared hosting system. This string will likely also include the Data Source and Initial Catalog parameters"
Dim conn1 As New ServerConnection(sqlConnection1)
Try
Dim testConnection As New Server(conn1)
Debug.WriteLine("Server: " + testConnection.Name)
Debug.WriteLine("Edition: " + testConnection.Information.Edition)
Debug.WriteLine(" ")
Dim db2 = testConnection.Databases("the name of the database to which the User ID/Password in the connection string applies")
For Each fg As FileGroup In db2.FileGroups
Debug.Write(fg.Name & " - ")
For Each df As DataFile In fg.Files
Debug.WriteLine(df.Name + " - " + df.FileName)
Next
Next
For Each db3 As Database In testConnection.Databases
Debug.Write(db3.Name & " - ")
For Each fg As FileGroup In db3.FileGroups
Debug.Write(fg.Name & " - ")
For Each df As DataFile In fg.Files
Debug.WriteLine(df.Name + " - " + df.FileName)
Next
Next
Next
conn1.Disconnect()
Catch err As Exception
Debug.WriteLine(err.Message)
End Try
W tej drugiej pętli iteracji kod kompiluje się dobrze, ale ponieważ SMO nie był skonfigurowany do uzyskiwania dostępu do dokładnie poprawnej bazy danych z dokładną składnią, ta próba kończy się niepowodzeniem.
Ponieważ dopiero uczę się SMO, pomyślałem, że inni nowicjusze mogą docenić, wiedząc, że istnieje również prostsze wyjaśnienie tego błędu - po prostu źle go zakodowaliśmy.