ฉันพบข้อผิดพลาดเดียวกันขณะใช้ Server Management Objects (SMO) ใน vb.net (ฉันแน่ใจว่าเหมือนกันใน C #)
ความคิดเห็นของ Techie Joe ในโพสต์เริ่มต้นเป็นคำเตือนที่มีประโยชน์ว่าในการแชร์โฮสติ้งจะมีสิ่งอื่น ๆ อีกมากมายเกิดขึ้น ใช้เวลาเล็กน้อยในการคิดออก แต่โค้ดด้านล่างแสดงให้เห็นว่าต้องมีความเฉพาะเจาะจงมากเพียงใดในวิธีที่พวกเขาเข้าถึงฐานข้อมูล SQL ข้อผิดพลาด 'เซิร์ฟเวอร์หลัก ... ' ดูเหมือนจะปรากฏขึ้นเมื่อใดก็ตามที่การเรียก SMO ไม่ได้เจาะจงอย่างแม่นยำในสภาพแวดล้อมการโฮสต์ที่ใช้ร่วมกัน
ส่วนแรกของโค้ดนี้ต่อต้านเซิร์ฟเวอร์ SQL Express ภายในเครื่องและอาศัยการพิสูจน์ตัวตนของ Windows อย่างง่าย รหัสทั้งหมดที่ใช้ในตัวอย่างเหล่านี้อ้างอิงจากบทช่วยสอน SMO โดย Robert Kanasz ในบทความเว็บไซต์ Code Project นี้ :
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
โค้ดด้านบนค้นหาไฟล์. mdf สำหรับทุกฐานข้อมูลบนเซิร์ฟเวอร์ SQLEXPRESS ในเครื่องได้ดีเนื่องจากการตรวจสอบความถูกต้องได้รับการจัดการโดย Windows และมีความกว้างในฐานข้อมูลทั้งหมด
ในโค้ดต่อไปนี้มี 2 ส่วนที่ทำซ้ำสำหรับไฟล์. mdf ในกรณีนี้มีเพียงการวนซ้ำครั้งแรกที่มองหากลุ่มไฟล์เท่านั้นที่ทำงานได้และพบเพียงไฟล์เดียวเนื่องจากการเชื่อมต่อมีเพียงฐานข้อมูลเดียวในสภาพแวดล้อมการโฮสต์ที่ใช้ร่วมกัน
การทำซ้ำครั้งที่สองซึ่งเป็นสำเนาของการทำซ้ำที่ทำงานข้างต้นจะหายไปทันทีเนื่องจากวิธีการเขียนนั้นพยายามเข้าถึงฐานข้อมูลที่ 1 ในสภาพแวดล้อมที่ใช้ร่วมกันซึ่งไม่ใช่รหัสที่ใช้ 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 ฉันคิดว่ามือใหม่คนอื่น ๆ อาจจะชอบที่รู้ว่ามีคำอธิบายที่ง่ายกว่านี้สำหรับข้อผิดพลาดนี้ด้วย - เราเพิ่งเขียนรหัสผิด