Я столкнулся с той же ошибкой при использовании объектов управления сервером (SMO) в vb.net (я уверен, что то же самое и в C #)
Комментарий Techie Joe к первоначальному посту был полезным предупреждением о том, что в виртуальном хостинге происходит много дополнительных вещей. Понадобилось немного времени, чтобы разобраться, но приведенный ниже код показывает, как нужно быть очень конкретным в способе доступа к базам данных SQL. Ошибка «принципала сервера ...», казалось, появлялась всякий раз, когда вызовы SMO не были точно конкретными в среде общего хостинга.
Этот первый раздел кода был направлен против локального сервера SQL Express и полагался на простую аутентификацию Windows. Весь код, используемый в этих примерах, основан на учебнике Роберта Канаша по SMO в этой статье веб-сайта 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
Приведенный выше код прекрасно находит файлы .mdf для каждой базы данных на локальном сервере SQLEXPRESS, потому что аутентификация обрабатывается Windows и распространяется на все базы данных.
В следующем коде есть 2 раздела, повторяющиеся для файлов .mdf. В этом случае работает только первая итерация, ищущая файловую группу, и она находит только один файл, потому что соединение осуществляется только с одной базой данных в среде общего хостинга.
Вторая итерация, которая является копией той итерации, которая работала выше, немедленно подавляется, потому что способ ее написания пытается получить доступ к 1-й базе данных в общей среде, которая не является той, к которой применяется идентификатор пользователя / пароль, поэтому SQL-сервер возвращает ошибку авторизации в виде ошибки «участник-сервер ...».
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, я подумал, что другим новичкам может быть интересно узнать, что есть более простое объяснение этой ошибки - мы просто неправильно ее закодировали.