Encontré el mismo error al usar Server Management Objects (SMO) en vb.net (estoy seguro de que es el mismo en C #)
El comentario de Techie Joe sobre la publicación inicial fue una advertencia útil de que en el alojamiento compartido están sucediendo muchas cosas adicionales. Tomó un poco de tiempo averiguarlo, pero el código a continuación muestra cómo uno tiene que ser muy específico en la forma en que accede a las bases de datos SQL. El error 'servidor principal ...' parecía aparecer siempre que las llamadas SMO no eran precisamente específicas en el entorno de alojamiento compartido.
Esta primera sección de código fue contra un servidor SQL Express local y se basó en la autenticación de Windows simple. Todo el código utilizado en estos ejemplos se basa en el tutorial SMO de Robert Kanasz en este artículo del sitio web de 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
El código anterior encuentra los archivos .mdf para cada base de datos en el servidor SQLEXPRESS local muy bien porque la autenticación es manejada por Windows y es amplia en todas las bases de datos.
En el siguiente código hay 2 secciones que se repiten para los archivos .mdf. En este caso, solo funciona la primera iteración que busca un grupo de archivos, y solo encuentra un solo archivo porque la conexión es solo a una sola base de datos en el entorno de alojamiento compartido.
La segunda iteración, que es una copia de la iteración que funcionó anteriormente, se ahoga inmediatamente porque la forma en que está escrita intenta acceder a la primera base de datos en el entorno compartido, que no es a la que se aplica el ID de usuario / contraseña, por lo que el servidor SQL devuelve un error de autorización en forma de error "principal del servidor ...".
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
En ese segundo ciclo de iteración, el código se compila bien, pero debido a que SMO no se configuró para acceder precisamente a la base de datos correcta con la sintaxis precisa, ese intento falla.
Como estoy aprendiendo SMO, pensé que otros novatos podrían apreciar saber que también hay una explicación más simple para este error: simplemente lo codificamos mal.