vb.net에서 SMO (서버 관리 개체)를 사용하는 동안 동일한 오류가 발생했습니다 (C #에서도 동일 함).
초기 게시물에 대한 Techie Joe의 의견은 공유 호스팅에서 많은 추가 작업이 진행되고 있다는 유용한 경고였습니다. 알아내는 데 약간의 시간이 걸렸지 만 아래 코드는 SQL 데이터베이스에 액세스하는 방식이 매우 구체적이어야하는 방법을 보여줍니다. '서버 주체 ...'오류는 공유 호스팅 환경에서 SMO 호출이 정확히 구체적이지 않을 때마다 나타나는 것처럼 보였습니다.
이 코드의 첫 번째 섹션은 로컬 SQL Express 서버에 대한 것이며 간단한 Windows 인증에 의존했습니다. 이 샘플에 사용 된 모든 코드는이 코드 프로젝트 웹 사이트 기사 에서 Robert Kanasz의 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
위의 코드는 인증이 Windows에서 처리되고 모든 데이터베이스에서 광범위하기 때문에 로컬 SQLEXPRESS 서버의 모든 데이터베이스에 대한 .mdf 파일을 찾습니다.
다음 코드에는 .mdf 파일에 대해 반복되는 2 개의 섹션이 있습니다. 이 경우 파일 그룹을 찾는 첫 번째 반복 만 작동하며 공유 호스팅 환경의 단일 데이터베이스에만 연결되므로 단일 파일 만 찾습니다.
위에서 작동 한 반복의 사본 인 두 번째 반복은 작성 방식이 사용자 ID / 비밀번호가 적용되는 것이 아닌 공유 환경에서 첫 번째 데이터베이스에 액세스하려고 시도하기 때문에 즉시 질식합니다. 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를 배우는 중이기 때문에이 오류에 대한 더 간단한 설명이 있다는 사실을 알고있는 다른 초보자도 감사 할 것이라고 생각했습니다. 방금 잘못 코딩했습니다.