[ข้อผิดพลาด 1] SqlServer แจ้งข้อผิดพลาด: ต้องประกาศตัวแปรสเกลาร์ OleDbException
วันนี้ ฉันใช้ .net เพื่อดำเนินการ SqlServer โดยใช้ Oledb แต่จะรายงานเสมอว่า "ต้องประกาศตัวแปรสเกลาร์..." อย่างอธิบายไม่ได้ ฉันได้นำสองวิธีต่อไปนี้มาใช้ในโค้ด แต่ก็ไม่มีประโยชน์:
วิธีที่ 1: OleDbParameter[] p = ใหม่ OleDbParameter[] {
ใหม่ OleDbParameter("@aa",1),
ใหม่ OleDbParameter("@bb", "เชลลีย์"),
ใหม่ OleDbParameter("@cc",DateTime.Now)
-
Objcmd.Parameters.AddRange(p);
วิธีที่ 2: OleDbParameter pp;
pp = ใหม่ OleDbParameter("@aa",OleDbType.Integer);
pp.Value = 1;
Objcmd.Parameters.Add(pp);
pp = ใหม่ OleDbParameter("@bb", OleDbType.LongVarChar);
pp.Value = "เชลลีย์";
Objcmd.Parameters.Add(pp);
pp = ใหม่ OleDbParameter("@cc", OleDbType.Date);
pp.Value = DateTime.ตอนนี้;
Objcmd.Parameters.Add(pp); ไม่ว่าคุณจะเขียนอย่างไร มันจะแจ้งให้ "ตัวแปรสเกลาร์ @aa ต้องถูกประกาศ" เหตุผลสุดท้ายคือประโยคต่อไปนี้: OleDbCommand Objcmd = new OleDbCommand("insert into test (a, b,c) ค่า(@aa,@bb,@cc)", Objconn); การเขียนที่ถูกต้อง: OleDbCommand Objcmd = new OleDbCommand("insert into test (a,b,c)values(?,?,?)", Objconn);ทางนี้ผ่านไปตามปกติ. [ข้อผิดพลาด 2] Sybase พร้อมท์ข้อผิดพลาด: ไม่รองรับอินเทอร์เฟซนี้ (ข้อยกเว้นมาจาก HRESULT:0x80004002 (E_NOINTERFACE)).net ใช้ Oledb เพื่อดำเนินการ Sybase เนื่องจากพารามิเตอร์เดียวกันอาจถูกนำมาใช้หลายครั้งในคำสั่ง SQL รหัสคือ ดังต่อไปนี้:
OleDbCommand Objcmd = ใหม่ OleDbCommand("อัปเดตชุดทดสอบ a=@aa โดยที่ a=@aa ", Objconn);
OleDbParameter[] p = ใหม่ OleDbParameter[] {
ใหม่ OleDbParameter("aa",1),
ใหม่ OleDbParameter("aa",1)
-
Objcmd.Parameters.AddRange(p);
Objconn.เปิด();
Objcmd.ExecuteNonQuery();
Objconn.Close(); โค้ดด้านบนจะแสดงข้อผิดพลาด "ไม่รองรับอินเทอร์เฟซนี้ (ข้อยกเว้นมาจาก HRESULT: 0x80004002 (E_NOINTERFACE))" สาเหตุของปัญหาคือมีชื่อเหมือนกันสองชื่อในพารามิเตอร์ ในกรณีนี้ คุณจะต้องเขียนพารามิเตอร์เดียวเท่านั้น
OleDbCommand Objcmd = ใหม่ OleDbCommand("อัปเดตชุดทดสอบ a=@aa โดยที่ a=@aa ", Objconn);
OleDbParameter[] p = ใหม่ OleDbParameter[] {
ใหม่ OleDbParameter("aa",1)
};หรือ
OleDbCommand Objcmd = ใหม่ OleDbCommand("อัปเดตชุดทดสอบ a=@aa โดยที่ a=@aa2 ", Objconn);
OleDbParameter[] p = ใหม่ OleDbParameter[] {
ใหม่ OleDbParameter("aa",1),
ใหม่ OleDbParameter("aa2",1)
};【สรุป】
หากคุณเขียนโปรแกรมที่ต้องรองรับ SqlServer และ Sybase คุณต้องให้ความสนใจเป็นพิเศษในประเด็นนี้:
1.SqlServer จำเป็นต้องใช้ "?" เป็นตัวยึดตำแหน่งพารามิเตอร์ ซึ่งกำหนดให้แม้ว่าจะใช้พารามิเตอร์เดียวกัน ก็ต้องเพิ่มพารามิเตอร์หลายครั้ง
2. หาก Sybase ใช้พารามิเตอร์เดียวกันหลายครั้ง จะไม่สามารถเพิ่มพารามิเตอร์ได้หลายครั้ง มิฉะนั้นข้อผิดพลาดจะถูกรายงาน
http://www.cnblogs.com/shelley/archive/2010/05/25/1743438.html