字段长度大于最大值

Field length is > maximum

我正在使用 C# 开发一些中间件,使用 System.Data.Odbc 库与 v10 PSQL 数据库进行交互。我有一组工作 select 并按顺序插入查询 I 运行 偶尔完整的序列会毫无问题地执行,但大多数时候对于序列中的每个 INSERT 查询我的错误处理都会捕获异常:

错误 [HY000][普遍][ODBC 客户端接口][LNA][普遍][ODBC 引擎接口][日期记录管理器]字段长度大于最大值

我正在尝试了解这意味着什么以及如何解决它。

这是在 Windows 2008 R2 服务器上。我在 Visual Studios Community 2015 中使用 C# 从 Web 系统获取信息(此处没有问题)并将销售订单添加到服务器上使用 Pervasive SQL v10 数据库的其他系统。

PSQL 表很大,有 80-160 列,所以对于这 3 个表,我需要先向 I 运行 写入一个 select 查询以获取多余的值,然后将它们绑定为插入查询的参数。有 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++;
        }       
    }
}

(我在这里编辑了更清晰的发布代码,希望没有错字)

在最后几行 运行ning 中,函数调用序列中每个插入的错误触发器,或者整个序列成功完成。使用相同或不同的输入,这种情况会以大约 80/20 failure/success 的比率随机发生。

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