Saya mengalami kesalahan yang sama saat menggunakan Server Management Objects (SMO) di vb.net (Saya yakin itu sama di C #)
Komentar Techie Joe pada posting awal adalah peringatan yang berguna bahwa dalam shared hosting banyak hal tambahan yang terjadi. Butuh sedikit waktu untuk mengetahuinya, tetapi kode di bawah ini menunjukkan bagaimana seseorang harus sangat spesifik dalam cara mereka mengakses database SQL. Kesalahan 'server principal ...' tampaknya muncul setiap kali panggilan SMO tidak spesifik secara spesifik di lingkungan shared hosting.
Bagian pertama kode ini melawan server SQL Express lokal dan mengandalkan Autentikasi Windows sederhana. Semua kode yang digunakan dalam sampel ini didasarkan pada tutorial SMO oleh Robert Kanasz dalam artikel situs web Proyek Kode ini :
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
Kode di atas menemukan file .mdf untuk setiap database di server SQLEXPRESS lokal dengan baik karena otentikasi ditangani oleh Windows dan itu luas di semua database.
Dalam kode berikut, ada 2 bagian yang melakukan iterasi untuk file .mdf. Dalam kasus ini, hanya iterasi pertama yang mencari filegroup yang berfungsi, dan hanya menemukan satu file karena koneksi hanya ke satu database di lingkungan hosting bersama.
Iterasi kedua, yang merupakan salinan dari iterasi yang bekerja di atas, langsung tersedak karena cara penulisannya mencoba mengakses database pertama di lingkungan bersama, yang bukan database yang diterapkan oleh User ID / Password, jadi server SQL mengembalikan kesalahan otorisasi dalam bentuk kesalahan 'server principal ...'.
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
Dalam perulangan iterasi kedua, kode dikompilasi dengan baik, tetapi karena SMO tidak diatur untuk mengakses database yang benar dengan sintaks yang tepat, upaya itu gagal.
Karena saya baru belajar SMO, saya pikir pemula lain mungkin menghargai mengetahui ada juga penjelasan yang lebih sederhana untuk kesalahan ini - kami hanya salah mengkodekannya.