ODP.NET InsertCommand ошибочно возвращает ORA-01401: вставленное значение слишком велико для столбца

У меня есть функция С#, которая создает параметризованный запрос на вставку с использованием ODP.NET, который по какой-то причине продолжает возвращать исключение «ORA-01401: вставленное значение слишком велико для столбца».

Я тщательно проверил длину рассматриваемой строковой переменной, и она значительно ниже максимального размера столбца базы данных (длина 70 символов в столбце Varchar2 длиной 1024 символа). Что еще более странно, так это то, что если я вставляю значение как строку, а не как переменную параметра, вставка работает просто отлично. Вот код (параметризованный):

connectionString = GetConnectionString();
conn = new OracleConnection(connectionString);
OracleDataAdapter oda = new OracleDataAdapter();
conn.Open();
insertStatement = "INSERT INTO DOCS (ID, PATH, PAGES, USERID,SUFFIX, MASK) ";
insertStatement += "VALUES (:id, :itemUrl, 1, 'SHAREPOINT\\system',0,'000') ";
oda.InsertCommand = new OracleCommand(insertStatement, conn);
oda.InsertCommand.Parameters.Add(":id", docList[0].taskerID.ToString());
oda.InsertCommand.Parameters.Add(":itemUrl", itemUrl);
count += oda.InsertCommand.ExecuteNonQuery();

Я думаю, что, возможно, я что-то упускаю здесь с ODP.NET или на самом деле есть ошибка с ODP.NET, с которой я сталкиваюсь. Я использую Oracle.DataAccess версии 9.2.0.7 на своем сервере. Есть идеи?


person GVIrish    schedule 04.05.2011    source источник


Ответы (1)


Я заставил это работать с небольшой модификацией вашего кода, но я не получил такого же исключения, как вы.

Единственными изменениями, которые я сделал, было добавление «INTO» в оператор INSERT, а также двойные кавычки для имен параметров в элементах добавления коллекции.


create table DOCS (id varchar2(70) , path varchar2(70) , pages number, userid varchar2(70) , suffix varchar2(70), mask varchar2(70));

OracleDataAdapter oda = new OracleDataAdapter();
insertStatement = "INSERT INTO DOCS (ID, PATH, PAGES, USERID,SUFFIX, MASK) ";
insertStatement += "VALUES (:id, :itemUrl, 1, 'SHAREPOINT\\system',0,'000') ";
conn.Open();
oda.InsertCommand =  new OracleCommand(insertStatement, conn);
oda.InsertCommand.Parameters.Add(":id", "test1");
oda.InsertCommand.Parameters.Add(":itemUrl", "test2");
count += oda.InsertCommand.ExecuteNonQuery();

Я думаю, что у вас может быть что-то еще, чего не видно в вашем образце.

Я знаю, что я получил вашу ошибку (много раз), когда у меня есть параметры в кардинальном порядке, который отличается от ожидаемого набора параметров.

Это вызвано привязкой ODP по положению по умолчанию, а НЕ ПРИВЯЗКОЙ ПО ИМЕНИ (как это делала старая Ms oraClient).

Вы можете либо убедиться, что параметры действительно находятся в правильном положении, либо просто:

oda.InsertCommand.BindByName = true ;

чт

person Harrison    schedule 04.05.2011
comment
Да, это именно то, что было, я полностью упустил из виду проблему привязки по положению. И мы только что перешли с System.Data.OracleClient на этой неделе, поэтому он возник только сейчас, чтобы укусить меня. Большое спасибо за помощь! - person GVIrish; 05.05.2011