natknąłem się ten sam błąd podczas korzystania z obiektów Management Server (SMO) w VB.NET (jestem pewien, że to to samo w języku C#)
Komentarz Techie Joe na temat pierwszego wpisu był przydatnym ostrzeżeniem, że we wspólnym hostingu dzieje się wiele dodatkowych rzeczy. Potrzeba było trochę czasu, aby dowiedzieć się, ale poniższy kod pokazuje, jak trzeba być bardzo specyficznym w sposobie dostępu do baz danych SQL. Błąd "server principal ..." wydawał się pojawiać, gdy wywołania SMO nie były dokładnie określone we wspólnym środowisku hostingowym.
Pierwsza sekcja kodu była skierowana przeciwko lokalnemu serwerowi SQL Express i polegała na prostym uwierzytelnianiu systemu Windows. Cały kod stosowany w tych próbkach są oparte na kursie SMO Roberta Kanasz w tym Code Project website article:
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 dobrze ponieważ uwierzytelnianie jest obsługiwane przez Windows i jest szeroki 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 ma tylko jedna baza danych w udostępnianym ś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 zapisana, próbuje uzyskać dostęp do pierwszej bazy danych w środowisku współużytkowanym, która nie jest tą, do której identyfikator użytkownika/Hasło jest stosowane, więc serwer SQL zwraca błąd autoryzacji w postaci błędu "serwer główny ...".
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 iteracji pętli, kod kompiluje grzywny, ale ponieważ nie był ustawiony SMO właśnie dostęp do bazy danych z poprawną dokładnej składni, że próba nie powiedzie się.
Po prostu uczę się SMO Myślałem, że inni nowicjusze mogą docenić, wiedząc, że istnieje również prostsze wyjaśnienie tego błędu - po prostu zakodowaliśmy to źle.
"Hosting usługodawców"? Czy mówimy dedykowane czy udostępniane? Jeśli jest to dzielony serwer hostingowy, zdecydowanie zalecamy skontaktowanie się z dostawcą usług hostingowych w celu uzyskania pomocy. SQL w środowisku hostingu dzielonego jest notorycznie kłopotliwy i problematyczny. Nie ma to nic wspólnego z produktem, ale z zasadami, które dostawcy usług hostingowych stosują do serwera (ów). Każda firma hostingowa ma swój własny sposób na wykorzystanie SQL lub tak się wydaje. –