Длина поля> максимальная
Я работаю над некоторым промежуточным программным обеспечением в 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 секунд системной минуты.