栏位长度>最大值

时间:2019-02-10 02:42:52

标签: c# odbc pervasive-sql

我正在使用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。

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题,错误消息是正确的,并且指向我的时间戳。因为我使用变量AddTime对其进行了一次设置,然后将其发送到4个函数调用中的每一个,这就是为什么它顺序失败但有时可以工作的原因,可能是在系统分钟的前9秒钟。