我正在使用C#使用System.Data.Odbc库与v10 PSQL数据库进行交互的某种中间件。我有一组按顺序运行的工作选择查询和插入查询,偶尔会执行完整序列而不会出现问题,但是大多数情况下,对于该序列中的每个INSERT查询,我的错误处理都会捕获到异常:
错误[HY000] [普及] [ODBC客户端接口] [LNA] [普及] [ODBC引擎接口] [日期记录管理器]字段长度>最大
我正试图了解这意味着什么以及如何解决它。
这是在Windows 2008 R2服务器上。我在Visual Studios Community 2015中使用C#来从Web系统中获取信息(此处没有问题),并将销售订单添加到位于使用Pervasive SQL v10数据库的服务器上的另一个系统上。
PSQL表庞大,具有80-160列,因此对于我要写入的3个表,我首先运行一个选择查询以获取多余的值,然后将它们绑定为插入查询的参数。依次有4个SELECT / INSERT例程运行,最后一个在foreach循环中运行n次。
过去,我已经能够使用MS Access和PHP在此系统上运行此ODBC SELECT / INSERT序列。我尝试清理解决方案,重新启动服务器并重建,以及在命令上添加其他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。
答案 0 :(得分:0)
我已经解决了我的问题,错误消息是正确的,并且指向我的时间戳。因为我使用变量AddTime对其进行了一次设置,然后将其发送到4个函数调用中的每一个,这就是为什么它顺序失败但有时可以工作的原因,可能是在系统分钟的前9秒钟。