Bei der Verwendung von Server Management Objects (SMO) in vb.net ist der gleiche Fehler aufgetreten (ich bin sicher, dass er in C # identisch ist).
Techie Joes Kommentar zum ersten Beitrag war eine nützliche Warnung, dass beim Shared Hosting viele zusätzliche Dinge vor sich gehen. Es hat ein wenig gedauert, um herauszufinden, aber der folgende Code zeigt, wie genau man auf SQL-Datenbanken zugreifen muss. Der Fehler "Serverprinzipal ..." schien immer dann aufzutreten, wenn die SMO-Aufrufe in der gemeinsam genutzten Hosting-Umgebung nicht genau waren.
Dieser erste Codeabschnitt war gegen einen lokalen SQL Express-Server gerichtet und stützte sich auf die einfache Windows-Authentifizierung. Der gesamte in diesen Beispielen verwendete Code basiert auf dem SMO-Tutorial von Robert Kanasz in diesem Artikel auf der Code Project-Website :
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
Der obige Code findet die .mdf-Dateien für jede Datenbank auf dem lokalen SQLEXPRESS-Server in Ordnung, da die Authentifizierung von Windows verwaltet wird und sich über alle Datenbanken erstreckt.
Im folgenden Code werden zwei Abschnitte für die MDF-Dateien iteriert. In diesem Fall funktioniert nur die erste Iteration, die nach einer Dateigruppe sucht, und es wird nur eine einzelne Datei gefunden, da die Verbindung nur zu einer einzelnen Datenbank in der gemeinsam genutzten Hosting-Umgebung besteht.
Die zweite Iteration, bei der es sich um eine Kopie der oben beschriebenen Iteration handelt, wird sofort erstickt, da bei der Schreibweise versucht wird, auf die erste Datenbank in der gemeinsam genutzten Umgebung zuzugreifen, für die die Benutzer-ID / das Kennwort nicht gilt Der SQL Server gibt einen Autorisierungsfehler in Form des Fehlers 'Serverprinzipal ...' zurück.
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
In dieser zweiten Iterationsschleife wird der Code einwandfrei kompiliert. Da SMO jedoch nicht für den Zugriff auf die richtige Datenbank mit der genauen Syntax eingerichtet wurde, schlägt dieser Versuch fehl.
Da ich gerade SMO lerne, dachte ich, dass andere Neulinge es zu schätzen wissen, dass es auch eine einfachere Erklärung für diesen Fehler gibt - wir haben ihn einfach falsch codiert.