เมื่อฉันพบข้อผิดพลาดนี้ใน Visual Studio
“ มีข้อผิดพลาดเกี่ยวกับเครือข่ายหรือเฉพาะอินสแตนซ์เกิดขึ้นขณะทำการเชื่อมต่อกับ SQL Server ไม่พบเซิร์ฟเวอร์หรือไม่สามารถเข้าถึงได้ ตรวจสอบว่าชื่ออินสแตนซ์ถูกต้องและมีการกำหนดค่า SQL Server เพื่ออนุญาตการเชื่อมต่อระยะไกล (ผู้ให้บริการ: เนมไปป์ผู้ให้บริการข้อผิดพลาด: 40 - ไม่สามารถเปิดการเชื่อมต่อกับ SQL Server)”
... มันเป็นช่วงการทำงานของรหัส C # ต่อไปนี้ซึ่งพยายามรับข้อมูล SQL Server ของฉันเพื่อแสดงในตาราง การแบ่งเกิดขึ้นตรงกับบรรทัดที่ระบุว่า connect.Open ():
using (var connect = Connections.mySqlConnection)
{
const string query = "SELECT Name, Birthdate, Narrative FROM Friends";
using (var command = new SqlCommand(query, connect))
{
connect.Open();
using (var dr = command.ExecuteReader())
{
while (dr.Read())
{
// blah
}
}
}
}
มันอธิบายไม่ได้เพราะการสืบค้น SQL นั้นง่ายมากฉันมีสตริงการเชื่อมต่อที่ถูกต้องและเซิร์ฟเวอร์ฐานข้อมูลก็พร้อมใช้งาน ฉันตัดสินใจที่จะเรียกใช้แบบสอบถาม SQL ที่เกิดขึ้นจริงด้วยตนเองใน SQL Management Studio และมันก็ทำงานได้ดีและให้ผลหลายระเบียน แต่สิ่งหนึ่งที่โดดเด่นในผลการสืบค้น: มีข้อความ HTML ที่เข้ารหัสไม่ถูกต้องบางอย่างในเขตข้อมูลประเภท varchar (สูงสุด) ภายในตารางเพื่อน (โดยเฉพาะสัญลักษณ์ความคิดเห็นที่เข้ารหัสแล้วบางส่วนของการเรียงลำดับที่<!--
อยู่ในข้อมูลคอลัมน์ "บรรยาย" แถวข้อมูลผู้ต้องสงสัยมีลักษณะดังนี้:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
สังเกตสัญลักษณ์ HTML ที่เข้ารหัส " <
" ซึ่งย่อมาจากอักขระ "<" ยังไงก็เถอะมันเข้าไปในฐานข้อมูลและรหัส C # ของฉันไม่สามารถรับมันได้! มันล้มเหลวทุกครั้งที่สาย connect.Open ()! หลังจากฉันแก้ไขด้วยตนเองว่าข้อมูลแถวหนึ่งในตารางฐานข้อมูลเพื่อนและใส่อักขระ "<" ที่ถอดรหัสแล้วแทนทุกอย่างทำงานได้! นี่คือสิ่งที่แถวนั้นควรมีลักษณะ:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
ฉันแก้ไขแถวที่ไม่ดีหนึ่งแถวโดยใช้คำสั่ง UPDATE แบบง่ายด้านล่างนี้ แต่ถ้าคุณมีหลายแถวของ HTML ที่เข้ารหัสคุณอาจต้องใช้คำสั่ง UPDATE ที่ซับซ้อนยิ่งขึ้นซึ่งใช้ฟังก์ชัน REPLACE:
UPDATE Friends SET Narrative = '<!--HTML Comment -->Once upon a time...' WHERE Narrative LIKE '<%'
ดังนั้นคุณธรรมของเรื่องคือ (อย่างน้อยในกรณีของฉัน), sanitize เนื้อหา HTML ของคุณก่อนที่จะเก็บไว้ในฐานข้อมูลและคุณจะไม่ได้รับข้อผิดพลาด SQL Server นี้เป็นความลับในตอนแรก! (เอ่อการฆ่าเชื้อ / ถอดรหัสเนื้อหา HTML ของคุณอย่างถูกต้องเป็นหัวข้อของการสนทนาอื่นที่ควรค่าแก่การค้นหา StackOverflow แยกต่างหากหากคุณต้องการข้อมูลเพิ่มเติม!)