أوراكل "ORA-01008: ليس كل المتغيرات ملزمة" خطأ ث / معلمات

StackOverflow https://stackoverflow.com/questions/1422032

  •  07-07-2019
  •  | 
  •  

سؤال

وهذه هي المرة الأولى التي تعاملت مع أوراكل، وأواجه صعوبة في فهم لماذا أتلقى هذا الخطأ.

وأنا باستخدام ODT.NET أوراكل ث / C # مع التعليمات البرمجية التالية في الاستعلام حيث شرط:

WHERE table.Variable1 = :VarA
  AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%')
  AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%')

ووانا إضافة قيم المعلمات مثل ذلك:

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");

وعند تشغيل هذا الاستعلام، يعود الخادم:

ORA-01008: not all variables bound 

إذا أعلق إما من '(AND ....' خطوط، اكتمال الاستعلام بنجاح.

لماذا تشغيل الاستعلام من خلال ما يرام إذا أنا الاستعلام فقط مع معلمتين، ولكن ليس مع الثلاثة؟ الخطأ أتلقى حتى لا يكون له معنى

هل كانت مفيدة؟

المحلول

ومقدم ODP.Net من أوراكل يستخدم ربط من قبل منصب الافتراضية. لتغيير السلوك لربط بالاسم. تعيين BindByName لصحيح. مما يمكنك رفض تعريف مزدوج من المعلمات.

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}

نصائح أخرى

ويبدو سخيف، ولكن أعتقد عند استخدام نفس المتغير ربط مرتين لديك لتعيين مرتين:

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
cmd.Parameters.Add("VarC", "1234");

وبالتأكيد هذا صحيح مع الأصلية الديناميكي SQL في PL / SQL:

SQL> begin
  2     execute immediate 'select * from emp where ename=:name and ename=:name'
  3     using 'KING';
  4  end;
  5  /
begin
*
ERROR at line 1:
ORA-01008: not all variables bound


SQL> begin
  2     execute immediate 'select * from emp where ename=:name and ename=:name' 
  3     using 'KING', 'KING';
  4  end;
  5  /

PL/SQL procedure successfully completed.

وكنت قد تنظر أيضا إزالة الحاجة إلى أسماء المعلمات المكررة في SQL عن طريق تغيير SQL ل

table.Variable2 LIKE '%' || :VarB || '%'

ومن ثم الحصول على العميل الخاص بك لتوفير '٪' لأي قيمة VarB بدلا من فارغة. في بعض النواحي وأعتقد أن هذا هو أكثر طبيعية.

ويمكنك أيضا تغيير SQL ل

table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top