[الخطأ 1] يطالب SqlServer بالخطأ: يجب الإعلان عن المتغيرات العددية OleDbException
اليوم، أستخدم .net لتشغيل SqlServer باستخدام Oledb، لكنه يُبلغ دائمًا "يجب الإعلان عن متغير عددي..." لسبب غير مفهوم، لقد اعتمدت الطريقتين التاليتين في التعليمات البرمجية، ولكن دون جدوى:
الطريقة الأولى: OleDbParameter[] p = new OleDbParameter[] {
جديد OleDbParameter("@aa"،1)،
جديد OleDbParameter("@bb"،"shelley")،
OleDbParameter الجديد("@cc"،DateTime.Now)
};
Objcmd.Parameters.AddRange(p);
الطريقة الثانية: OleDbParameter ص؛
pp = new OleDbParameter("@aa",OleDbType.Integer);
ص. القيمة = 1؛
Objcmd.Parameters.Add(pp);
pp = new OleDbParameter("@bb", OleDbType.LongVarChar);
pp.Value = "شيلي"؛
Objcmd.Parameters.Add(pp);
pp = new OleDbParameter("@cc"، OleDbType.Date);
pp.Value = DateTime.Now;
Objcmd.Parameters.Add(pp); بغض النظر عن كيفية كتابته، فإنه سيطالبك "يجب الإعلان عن المتغير العددي @aa". والسبب الأخير هو الجملة التالية: OleDbCommand Objcmd = new OleDbCommand("insert into test (a,"). b,c)values(@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 = new OleDbCommand("تحديث مجموعة الاختبار a=@aa حيث a=@aa ", Objconn);
OleDbParameter[] p = new OleDbParameter[] {
معلمة OleDb جديدة ("aa"، 1)،
معلمة OleDb جديدة ("aa"، 1)
};
Objcmd.Parameters.AddRange(p);
Objconn.Open();
Objcmd.ExecuteNonQuery();
Objconn.Close(); سيطالب الكود أعلاه بالخطأ "هذه الواجهة غير مدعومة (الاستثناء يأتي من HRESULT: 0x80004002 (E_NOINTERFACE))". سبب المشكلة هو وجود اسمين متطابقين في المعلمات، وفي هذه الحالة، تحتاج فقط إلى كتابة معلمة واحدة.
OleDbCommand Objcmd = new OleDbCommand("تحديث مجموعة الاختبار a=@aa حيث a=@aa ", Objconn);
OleDbParameter[] p = new OleDbParameter[] {
معلمة OleDb جديدة ("aa"، 1)
}؛أو
OleDbCommand Objcmd = new OleDbCommand("تحديث مجموعة الاختبار a=@aa حيث a=@aa2 ", Objconn);
OleDbParameter[] p = new OleDbParameter[] {
معلمة OleDb جديدة ("aa"، 1)،
معلمة OleDb جديدة ("aa2"، 1)
};[تلخيص]
إذا كتبت برنامجًا يحتاج إلى دعم SqlServer وSybase، فعليك أن تولي اهتمامًا خاصًا لهذه النقطة:
1. يحتاج SqlServer إلى استخدام "؟" كعنصر نائب للمعلمة، الأمر الذي يتطلب أنه حتى في حالة استخدام نفس المعلمة، يجب إضافة المعلمة عدة مرات؛
2. إذا استخدم Sybase نفس المعلمة عدة مرات، فلا يمكن إضافة المعلمة عدة مرات، وإلا فسيتم الإبلاغ عن خطأ؛
http://www.cnblogs.com/shelley/archive/2010/05/25/1743438.html