Грешка 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. Свързване по ред означава, че името на параметъра се игнорира.

Или променете командата Свързване с име (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 го наричат ​​фабричен водопроводен метод! Обичам го. Създадох един в мое незнание и сега има име. Гласуван за! BTW - ВИНАГИ (т.е. през повечето време) използвам BindByName с Oracle - защо рискувам да забравя реда на колоните или каквото и да е? - person Allen; 22.10.2020
comment
Добре, ще се помоля на GO4 за прошка за богохулството. Какво ще кажете за фабричен метод, дефиниран в шаблонен код :D. Но връзката на XDS изглежда като доста добра глобална Mjölnir алтернатива - person StuartLC; 22.10.2020