Длина поля> максимальная

Я работаю над некоторым промежуточным программным обеспечением в C#, используя библиотеку System.Data.Odbc для взаимодействия с базой данных PSQL v10. У меня есть набор рабочих запросов выбора и вставки, которые я выполняю в последовательности, где иногда полная последовательность будет выполняться без проблем, но большую часть времени для каждого запроса INSERT в последовательности, в которой моя обработка ошибок ловит исключение:

ОШИБКА [HY000][Распространение] [Интерфейс клиента ODBC][LNA][Распространение] [Интерфейс механизма ODBC] [Диспетчер записи даты] Длина поля> максимальная

Я пытаюсь понять, что это значит и как это решить.

Это на сервере Windows 2008 R2. Я использую C# в Visual Studios Community 2015 для получения информации из веб-системы (здесь нет проблем) и добавления заказов на продажу в другую систему, расположенную на сервере, который использует базу данных Pervasive SQL v10.

Таблицы PSQL массивны с 80-160 столбцами, поэтому для трех таблиц, в которые мне нужно записать, я сначала запускаю запрос на выборку, чтобы получить лишние значения, а затем связать их как параметры для запроса вставки. Существует 4 подпрограммы SELECT/INSERT, которые выполняются последовательно, причем последняя из них выполняется n раз в цикле foreach.

В прошлом я мог запускать эту последовательность ODBC SELECT/INSERT в этой системе, используя MS Access и PHP. Я попытался очистить решение, перезагрузить сервер и перестроить, а также добавить дополнительные вызовы Dispose() для команд, но я все еще получаю эти ошибки.

class PSQLOrderConnector
{
    private OdbcConnection Odbc { get; }

    public PSQLOrderConnector()
    {
        Odbc = new OdbcConnection(Constants.ODBCSTRING);
        Odbc.Open();
    }

    /*
    ...
    */

    public void CreateOrderAddressBillTo(string CustomerCode, string OrderNumber, string AddDate, int AddTime)
    {
        OdbcCommand cmdSelectAddressB = new OdbcCommand();
        OdbcCommand cmdInsertAddressB = new OdbcCommand();

        cmdSelectAddressB = this.Odbc.CreateCommand();

        cmdSelectAddressB.CommandText = OrderQueries.PQSL_SELECT_ADDRESS_BY_CUSTOMER;
        cmdSelectAddressB.Parameters.Add("@CEV_NO", OdbcType.Text).Value = CustomerCode;

        OdbcDataReader reader = cmdSelectAddressB.ExecuteReader();

        reader.Read();

        var NAME = reader.GetString(0);
        /* ...repeat for the next 80 columns */

        cmdSelectAddressB.Dispose();

        cmdInsertAddressB = this.Odbc.CreateCommand();

        cmdInsertAddressB.CommandText = OrderQueries.PSQL_INSERT_ORDER_ADDRESS;
        cmdInsertAddressB.Parameters.Add("NAME", OdbcType.Text).Value = NAME;
        /* ...repeat for the next 80 variables */

        try
        {
            int result = cmdInsertAddressB.ExecuteNonQuery();
        }
        catch (OdbcException odbce)
        {
            //Exception error gets thrown here
        }

        cmdInsertAddressB.Dispose();
    }

    /*
    ...
    */
}       

class Order
{
    private PSQLOrderConnector PSQLOrder { get; }   

    public Order()
    {
        PSQLOrder = new PSQLOrderConnector();
    }       
    /*
    ...
    */

    public void AddOrders(List<businessEvent> Events )
    {
        /*
        ...
        */

        /* These 4 calls either pass in sequence or fail in sequence on the Try/Catch in the above class*/
        PSQLOrder.CreateOrderHeader(OrderNumber, CustomerCode, PONumber, SubTotal, CurrentCost, AverageCost, AddDate, AddTime);

        /* This is the method detailed above */
        PSQLOrder.CreateOrderAddressBillTo(CustomerCode, OrderNumber, AddDate, AddTime);

        PSQLOrder.CreateOrderAddressShipTo(CustomerCode, ShipToCode, OrderNumber, AddDate, AddTime);

        int recNo = 1;
        foreach (ItemLine line in itemLines)
        {
            PSQLOrder.CreateOrderDetail( OrderNumber, recNo, line.ItemCode, line.Quantity, line.Price, AddDate, AddTime);
            recNo++;
        }       
    }
}

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

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

1 ответ

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

Другие вопросы по тегам