J'ai rencontré la même erreur lors de l'utilisation d'objets de gestion de serveur (SMO) dans vb.net (je suis sûr que c'est la même chose en C #)
Le commentaire de Techie Joe sur le message initial était un avertissement utile que dans l'hébergement partagé, il se passe beaucoup de choses supplémentaires. Il a fallu un peu de temps pour comprendre, mais le code ci-dessous montre comment il faut être très spécifique dans la façon dont ils accèdent aux bases de données SQL. L'erreur «serveur principal ...» semblait apparaître chaque fois que les appels SMO n'étaient pas précisément spécifiques à l'environnement d'hébergement partagé.
Cette première section de code était basée sur un serveur SQL Express local et reposait sur une simple authentification Windows. Tout le code utilisé dans ces exemples est basé sur le didacticiel SMO de Robert Kanasz dans cet article du site Web 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
Le code ci-dessus trouve très bien les fichiers .mdf pour chaque base de données sur le serveur SQLEXPRESS local, car l'authentification est gérée par Windows et elle est étendue à toutes les bases de données.
Dans le code suivant, il y a 2 sections itérant pour les fichiers .mdf. Dans ce cas, seule la première itération à la recherche d'un groupe de fichiers fonctionne et ne trouve qu'un seul fichier car la connexion est à une seule base de données dans l'environnement d'hébergement partagé.
La deuxième itération, qui est une copie de l'itération qui a fonctionné ci-dessus, s'étouffe immédiatement car la façon dont elle est écrite essaie d'accéder à la 1ère base de données dans l'environnement partagé, qui n'est pas celle à laquelle s'applique l'ID utilisateur / mot de passe, donc le serveur SQL renvoie une erreur d'autorisation sous la forme de l'erreur «serveur principal ...».
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
Dans cette deuxième boucle d'itération, le code se compile correctement, mais comme SMO n'a pas été configuré pour accéder précisément à la base de données correcte avec la syntaxe précise, cette tentative échoue.
Alors que j'apprends SMO, je pensais que d'autres débutants pourraient apprécier de savoir qu'il y avait aussi une explication plus simple à cette erreur - nous l'avons juste mal codée.