Ошибка при изменении записи в строке базы Firebird

Рейтинг: 0Ответов: 1Опубликовано: 16.03.2015

Работаю в C# с базой Firebird. Есть таблица с полем типа varchar, кодировкой Win1251 и установленной длинной 2000. При изменении именно в этом поле некоторые записи выдают ошибку

firebird arithmetic exception, numeric overflow, or string truncation

string right truncation

Не пойму, в чем проблема.

P.S. Вот что я заметил. Если в поле общая длина составляет больше 1036 символов, то при запросе на изменение и выходит эта ошибка.

Сам код :

    using (FbConnection con = new FbConnection(ConString))
{
    con.Open();

    string sql = "UPDATE OR INSERT INTO 'PARTS' ('ID','PART','DATAOTGR','CONTRACT','MBRUTTO','MNETTO','EXPORTED','PAKETS') \n" +
                "VALUES (@id,@part,@dataotgr,@contract,@mbrutto,@mnetto,@exported,@pakets) \n" +
                "matching (id);";

    FbCommand InsertSQL = new FbCommand(sql, con);

    FbParameter param;                      //создаем параметр
    param = new FbParameter("@ID", obj.id.ToString()); //добавляем значения и имя
    InsertSQL.Parameters.Add(param);        //теперь добавляем параметр к комманде

    param = new FbParameter("@PART", obj.part1); //и дальше так же только и меняем что значения
    InsertSQL.Parameters.Add(param);

    param = new FbParameter("@dataotgr", obj.dataOtgr); param.FbDbType = FbDbType.Date;
    InsertSQL.Parameters.Add(param);

    param = new FbParameter("@contract", obj.contract);
    InsertSQL.Parameters.Add(param);

    param = new FbParameter("@MBRUTTO", obj.mBrutto);
    InsertSQL.Parameters.Add(param);

    param = new FbParameter("@MNETTO", obj.mNetto);
    InsertSQL.Parameters.Add(param);

    //не соответствие типов и бла-бла-бла. преобразуем bool в string, в самой базе CHAR(1)
    string exp = obj.exported ? "1" : "0";
    param = new FbParameter("@exported", exp);
    InsertSQL.Parameters.Add(param);

    param = new FbParameter("@pakets", obj.pakets);  //АГА! вот оно проблемное поле. обычно длина строки  obj.pakets более 1000 символов.
    InsertSQL.Parameters.Add(param);

    FbTransaction fbt = con.BeginTransaction(); //стартуем транзакцию
    InsertSQL.Transaction = fbt; // проинициализация транзакции для объекта InsertSQL
    int res = InsertSQL.ExecuteNonQuery(); //нуу ... сам запрос отправляем

    fbt.Commit(); //если вставка прошла успешно - комитим транзакцию                    
    con.Close();  //закрываем соединение
}

Ответы

▲ 1

В Firebird 2.5 VARCHAR(n) позволяет хранить до 32КБ.

Для более точного ответа, пожалуйста, приведите пример кода.

Обновление

Я бы вместо 2х строк написал одну:

InsertSQL.Parameters.AddWithValue("@pakets", obj.pakets);