Tôi gặp 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 đó là giống nhau trong C#)
Nhận xét của Techie Joe về bài đăng đầu tiên là một cảnh báo hữu ích trong việc chia sẻ lưu trữ nhiều điều bổ sung đang diễn ra. Phải mất một ít thời gian để tìm ra, nhưng đoạn mã dưới đây cho thấy cách người ta 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 cuộc 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 vào Xác thực Windows đơn giản. Tất cả các mã được sử dụng trong các mẫu được dựa trên các hướng dẫn SMO bởi Robert Kanasz trong Code Project website article 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 phát hiện các tập tin MDF cho mỗi cơ sở dữ liệu trên máy chủ SQLEXPRESS địa phương tốt vì xác thực được xử lý bởi Windows và nó là rộng trên tất cả các cơ sở dữ liệu.
Trong mã sau có 2 phần lặp cho tệp .mdf. Trong trường hợp này chỉ có lần lặp đầu tiên tìm kiếm một filegroup hoạt động, và nó chỉ tìm thấy một tệp duy nhất vì kết nối là chỉ một cơ sở dữ liệu duy nhất trong môi trường lưu trữ được chia sẻ.
Lặp lại thứ hai, là bản sao của phép lặp đã làm việc ở trên, chokes ngay lập tức vì cách nó được ghi nó cố truy cập cơ sở dữ liệu thứ nhất trong môi trường chia sẻ, không phải là ID người dùng/Mật khẩu được áp dụng, vì vậy máy chủ SQL trả về lỗi ủy quyền dưới 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, cố gắng không thành công.
Vì tôi vừa mới học SMO, tôi nghĩ những người mới khác có thể cảm kích vì biết rằng cũng có một lời giải thích đơn giản hơn về lỗi này - chúng tôi đã viết mã sai.
'Nhà cung cấp dịch vụ lưu trữ'? Chúng ta đang nói chuyện riêng hay chia sẻ? Nếu đó là một máy chủ lưu trữ được chia sẻ, tôi khuyên bạn nên liên hệ với nhà cung cấp dịch vụ lưu trữ của bạn để được trợ giúp. SQL trong môi trường lưu trữ được chia sẻ nổi tiếng là lỗi và có vấn đề. Nó không liên quan gì đến sản phẩm nhưng các chính sách mà nhà cung cấp dịch vụ lưu trữ áp dụng cho (các) máy chủ. Mỗi công ty lưu trữ có cách riêng của họ để tận dụng SQL hoặc có vẻ như vậy. –