使用 ODP.net 更新表时出现 ORA-01722 错误

Kiq*_*net 1 c# oracle parameters odp.net sql-update

我正在尝试更新一个类似于以下内容的表:

column a VARCHAR2(80)
Run Code Online (Sandbox Code Playgroud)

使用以下函数:

sqlString = "UPDATE TABLE SET domicilio = :p_domicilio WHERE codigo = :p_codigo";
string sqlCommandtext = sqlString; 
using (var cn = new OracleConnection("DATA SOURCE=XXX..."))
{
    cn.Open();

    using (OracleCommand commandInt32 = cn.CreateCommand())
    {
        cmd.CommandText = sqlCommandtext;
        cmd.Parameters.Add("p_codigo", OracleDbType.Int32, 34620, ParameterDirection.Input);

        cmd.Parameters.Add("p_domicilio", OracleDbType.Varchar2, ParameterDirection.Input).Value = domicilio;
        //cmd.Parameters.Add("p_domicilio", OracleDbType.Varchar2, domicilio, ParameterDirection.Input);

        cmd.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

但得到“ ORA-01722 无效号码”异常。

我试试

cmd.Parameters.Add("p_domicilio", OracleDbType.Varchar2, ParameterDirection.Input).Value = domicilio;
Run Code Online (Sandbox Code Playgroud)

cmd.Parameters.Add("p_domicilio", OracleDbType.Varchar2, domicilio, ParameterDirection.Input);
Run Code Online (Sandbox Code Playgroud)

    var pDomicilio = new Oracle.DataAccess.Client.OracleParameter()
    {
        DbType = DbType.String,
        Value = domicilio,
        Direction = ParameterDirection.Input,
        OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2,
        ParameterName = "p_domicilio",
    };
Run Code Online (Sandbox Code Playgroud)

Stu*_*tLC 6

默认情况下,ODP.Net 按提供的顺序而不是名称绑定参数,并且您codigo在第一个参数之前指定第二个参数domicilio。按顺序绑定意味着忽略参数的名称。

将命令绑定更改为名称( cmd.BindByName = true),或按照在命令中使用的顺序提供参数。

如果这是一个大项目,我建议创建一个用于返回OracleCommands的工厂管道方法,该方法将设置为BindByName