Я работаю на некотором промежуточном программном обеспечении в 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 столбцами, поэтому для 3 таблиц, которые мне нужно записать, я сначала запускаю запрос на выборку, чтобы получить лишние значения, а затем связать их как параметры для запроса вставки.Существует 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.