Vb.net'te Server Management Objects (SMO) kullanırken aynı hatayla karşılaştım (C # ile aynı olduğundan eminim)
Techie Joe'nun ilk gönderiye yaptığı yorum, paylaşılan barındırmada birçok ek şeyin devam ettiği konusunda faydalı bir uyarı oldu. Anlaması biraz zaman aldı, ancak aşağıdaki kod, SQL veritabanlarına erişme yöntemlerinin nasıl çok spesifik olması gerektiğini gösteriyor. SMO çağrıları paylaşılan barındırma ortamında tam olarak spesifik olmadığında 'sunucu asıl ...' hatası ortaya çıkıyor gibi görünüyordu.
Kodun bu ilk bölümü yerel bir SQL Express sunucusuna karşıydı ve basit Windows Kimlik Doğrulamasına dayanıyordu. Bu örneklerde kullanılan tüm kodlar, bu Kod Projesi web sitesi makalesindeki Robert Kanasz'ın SMO öğreticisine dayanmaktadır :
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
Yukarıdaki kod, yerel SQLEXPRESS sunucusundaki her veritabanı için .mdf dosyalarını bulur, çünkü kimlik doğrulama Windows tarafından yapılır ve tüm veritabanları için geniş.
Aşağıdaki kodda .mdf dosyaları için yinelenen 2 bölüm vardır. Bu durumda, yalnızca bir dosya grubunu arayan ilk yineleme çalışır ve yalnızca tek bir dosya bulur çünkü bağlantı, paylaşılan barındırma ortamındaki tek bir veritabanına bağlıdır.
Yukarıda çalışan yinelemenin bir kopyası olan ikinci yineleme, yazılma şekliyle Kullanıcı Kimliği / Parolanın geçerli olmadığı paylaşılan ortamda 1. veritabanına erişmeye çalıştığı için hemen boğulur. SQL sunucusu 'sunucu asıl ...' hatası şeklinde bir yetkilendirme hatası döndürür.
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
Bu ikinci yineleme döngüsünde, kod iyi derlenir, ancak SMO, kesin sözdizimi ile tam olarak doğru veritabanına erişecek şekilde ayarlanmadığı için bu girişim başarısız olur.
SMO'yu yeni öğrenirken, diğer yeni başlayanların da bu hatanın daha basit bir açıklaması olduğunu bilmekten memnun kalacaklarını düşündüm - sadece yanlış kodladık.