Ошибка ORA-01722 при обновлении таблицы с помощью 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",
    };

person Kiquenet    schedule 24.10.2014    source источник


Ответы (1)


По умолчанию ODP.Net связывает параметры в порядке их предоставления, а не по имени, и вы указываете второй параметр codigo перед первым параметром domicilio. Привязка по порядку означает, что имя параметра игнорируется.

Либо измените команду Binding to Name (cmd.BindByName = true), либо укажите параметры в том же порядке, в котором они используются в вашей команде.

Если это большой проект, я бы предложил создать метод фабричной сантехники для возврата OracleCommands, который будет установлен на BindByName

person StuartLC    schedule 24.10.2014
comment
В качестве альтернативы вы можете включить bindbyname по умолчанию в настройках web.config на stackoverflow.com/a/44928408/863651. - person XDS; 29.06.2018
comment
Хорошо, где в книге GO4 они называют это заводским водопроводным методом! Я люблю это. Создал один в своем невежестве, и теперь у него есть имя. Проголосовал! Кстати, я ВСЕГДА (то есть большую часть времени) использую BindByName с Oracle - зачем рисковать забыть порядок столбцов или что-то еще? - person Allen; 22.10.2020
comment
Хорошо, я буду молить GO4 о прощении за богохульство. Как насчет фабричного метода, определенного в шаблонном коде: D. Но ссылка XDS выглядит как неплохая глобальная Mjölnir альтернатива - person StuartLC; 22.10.2020