在vb.net中使用服务器管理对象(SMO)时遇到了相同的错误(我确信在C#中是相同的)
Techie Joe在最初的帖子中发表的评论是一个有用的警告,即在共享主机中还有许多其他事情正在进行。花了一点时间弄清楚,但是下面的代码显示了如何访问SQL数据库必须非常具体。每当共享主机环境中的SMO调用不完全特定时,“服务器主体...”错误似乎就会出现。
代码的第一部分针对本地SQL Express服务器,并且依赖于简单的Windows身份验证。这些示例中使用的所有代码均基于Robert Kanasz在此Code Project网站文章中的SMO教程:
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
上面的代码在本地SQLEXPRESS服务器上找到每个数据库的.mdf文件就很好了,因为身份验证是由Windows处理的,并且它遍及所有数据库。
在以下代码中,有2个部分迭代.mdf文件。在这种情况下,只有查找文件组的第一次迭代才有效,并且由于连接到共享托管环境中的单个数据库,因此它仅找到单个文件。
第二个迭代是上面工作的迭代的副本,它立即阻塞,因为它的编写方式试图访问共享环境中的第一个数据库,而不是用户ID /密码适用的那个数据库,因此SQL Server以“服务器主体...”错误的形式返回授权错误。
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
在第二个迭代循环中,代码可以正常编译,但是由于未设置SMO来使用精确的语法精确地访问正确的数据库,因此该尝试失败。
当我刚学习SMO时,我想其他新手可能会喜欢,知道对此错误还有一个更简单的解释-我们只是将其编码为错误。