Why am I getting an ORA-01722 (invalid number)?

前端 未结 3 1799
花落未央
花落未央 2021-02-14 21:28

I\'ve been using a parameterized query to insert values into an Oracle table, like so:

var q = \"insert into MyTable(Field1, Field2...) values(:Field1, :Field2..         


        
相关标签:
3条回答
  • 2021-02-14 21:55

    I have given answer credit already, but I think it's worth mentioning here exactly what the root of my problems was, in case anyone else finds this item while looking for an answer to their own problem.

    The problem is that the C# implementation of parameterized queries for Oracle contains a serious and potentially dangerous bug - a real "pit in the public domain":

    It doesn't matter what you name your parameters; they have to be added in the order in which they appear in the query.

    See more here.

    0 讨论(0)
  • 2021-02-14 22:10
    command.BindByName = true;
    

    Please see this explination.

    0 讨论(0)
  • 2021-02-14 22:13

    When you say you checked the parameters do you mean the Parameters collection on the SqlCommand class? You might be falling foul of this note on the SqlParameter page:

    Use caution when you use this overload of the SqlParameter constructor to specify integer parameter values. Because this overload takes a value of type Object, you must convert the integral value to an Object type when the value is zero, as the following C# example demonstrates. Copy

    Parameter = new SqlParameter("@pname", Convert.ToInt32(0));
    

    If you do not perform this conversion, the compiler assumes that you are trying to call the SqlParameter (string, SqlDbType) constructor overload.

    I'd suggest you use something like

    cmd.Parameters.Add(
       new SqlParameter("Field1", SqlDbType.Int32) { Value = field1Val });
    

    instead to explicitly set the type.

    0 讨论(0)
提交回复
热议问题