Encontrei o mesmo erro ao usar Server Management Objects (SMO) em vb.net (tenho certeza que é o mesmo em C #)
O comentário de Techie Joe na postagem inicial foi um aviso útil de que na hospedagem compartilhada muitas coisas adicionais estão acontecendo. Demorou um pouco para descobrir, mas o código a seguir mostra como é preciso ser muito específico na forma de acessar os bancos de dados SQL. O erro 'principal do servidor ...' parecia aparecer sempre que as chamadas SMO não eram precisamente específicas no ambiente de hospedagem compartilhada.
Esta primeira seção do código foi contra um servidor SQL Express local e contou com a autenticação simples do Windows. Todos os códigos usados nesses exemplos são baseados no tutorial SMO de Robert Kanasz neste artigo do site do Projeto de código :
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
O código acima encontra os arquivos .mdf para cada banco de dados no servidor SQLEXPRESS local perfeitamente porque a autenticação é controlada pelo Windows e é ampla em todos os bancos de dados.
No código a seguir, há 2 seções iterando para os arquivos .mdf. Nesse caso, apenas a primeira iteração à procura de um grupo de arquivos funciona e só encontra um único arquivo, pois a conexão é feita com apenas um único banco de dados no ambiente de hospedagem compartilhado.
A segunda iteração, que é uma cópia da iteração que funcionou acima, bloqueia imediatamente porque da forma como está escrita tenta acessar a 1ª base de dados do ambiente compartilhado, que não é aquele ao qual se aplica o User ID / Password, portanto o servidor SQL retorna um erro de autorização na forma do erro 'principal do 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
Nesse segundo loop de iteração, o código compila bem, mas como o SMO não foi configurado para acessar precisamente o banco de dados correto com a sintaxe precisa, essa tentativa falha.
Como estou aprendendo o SMO, achei que outros novatos gostariam de saber que há uma explicação mais simples para esse erro - apenas codificamos errado.