Tôi gặp phải lỗi tương tự khi sử dụng Đối tượng quản lý máy chủ (SMO) trong vb.net (tôi chắc chắn rằng nó giống nhau trong C #)
Nhận xét của Techie Joe về bài đăng đầu tiên là một lời cảnh báo hữu ích rằng trong chia sẻ lưu trữ có rất nhiều thứ bổ sung đang diễn ra. Phải mất một chút thời gian để tìm ra, nhưng đoạn mã dưới đây cho thấy cách một người phải rất cụ thể trong cách họ truy cập cơ sở dữ liệu SQL. Lỗi 'máy chủ chính ...' dường như xuất hiện bất cứ khi nào các lệnh gọi SMO không chính xác cụ thể trong môi trường lưu trữ được chia sẻ.
Đoạn mã đầu tiên này chống lại máy chủ SQL Express cục bộ và dựa trên Xác thực Windows đơn giản. Tất cả mã được sử dụng trong các mẫu này đều dựa trên hướng dẫn SMO của Robert Kanasz trong bài viết trên trang web Dự án Mã này :
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ạn mã trên tìm thấy các tệp .mdf cho mọi cơ sở dữ liệu trên máy chủ SQLEXPRESS cục bộ tốt vì quá trình xác thực được Windows xử lý và nó có phạm vi rộng trên tất cả các cơ sở dữ liệu.
Trong đoạn mã sau, có 2 phần lặp lại cho các tệp .mdf. Trong trường hợp này, chỉ lần lặp đầu tiên tìm kiếm nhóm tệp mới hoạt động và nó chỉ tìm thấy một tệp duy nhất vì kết nối chỉ đến một cơ sở dữ liệu duy nhất trong môi trường lưu trữ được chia sẻ.
Lần lặp thứ hai, là một bản sao của lần lặp đã hoạt động ở trên, bị nghẹt ngay lập tức vì cách nó được viết cố gắng truy cập cơ sở dữ liệu thứ nhất trong môi trường chia sẻ, không phải là cơ sở dữ liệu mà User ID / Password áp dụng, vì vậy máy chủ SQL trả về lỗi ủy quyền ở dạng lỗi 'máy chủ chính ...'.
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
Trong vòng lặp thứ hai đó, mã biên dịch tốt, nhưng vì SMO không được thiết lập để truy cập chính xác cơ sở dữ liệu chính xác với cú pháp chính xác, nỗ lực đó không thành công.
Vì tôi chỉ mới học SMO, tôi nghĩ những người mới khác có thể đánh giá cao khi biết rằng cũng có một lời giải thích đơn giản hơn cho lỗi này - chúng tôi chỉ mã hóa sai.