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

时间:2014-10-24 11:37:43

标签: c# oracle parameters sql-update odp.net

我正在尝试更新一个类似于:

的表格
column a VARCHAR2(80)

使用以下功能:

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();
    }
}

但获取“ ORA-01722无效号”例外。

我试试

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

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

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

1 个答案:

答案 0 :(得分:4)

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

更改命令Binding to Namecmd.BindByName = true),或按照命令中使用的顺序提供参数。

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