【问题标题】:DB2 SQL Error: SQLCODE=-117, SQLSTATE=42802, SQLERRMC=null, DRIVER=3.68.61DB2 SQL 错误:SQLCODE=-117,SQLSTATE=42802,SQLERRMC=null,DRIVER=3.68.61
【发布时间】:2017-06-21 15:46:31
【问题描述】:

我在使用 Java 开发并将记录插入 DB2 数据库时遇到了这个问题。

sqlInsert = "INSERT into SI_Orders (SellersNo,OrderDate,ShipDatePlanned,"
            + "Warehouse,OrderType,ShipToName,ShipToAddress1,"
            + "ShipToCity,ShipToProvState,ShipToPostalZip,ShipToCountry" + ") "
            + "VALUES (?, ?, ?,'01','DO','bob','a','toronto','ON','h0h0h0','CA')";

    try {
        con = dc.getConnection();
        con.setAutoCommit(false);
        db2Stmt = con.prepareStatement(sqlInsert);

        for (Order order : orderWrapper.orders) {
            save1 = con.setSavepoint();
            db2Stmt.setString(1, order.getOrderId());
            db2Stmt.setTimestamp(2, shipStnDateFormat( order.getOrderDate() ) );            
            db2Stmt.setString(3, null); // PONo
             /*
             * db2Stmt.setTimestamp(4, shipStnDateFormat(order.getShipByDate()));
             */
            db2Stmt.executeUpdate();    
            //con.commit();
        } // end of enhanced for each block
    } // end of try block

    catch (SQLException e1) {
        e1.printStackTrace();
        if (con != null) {
            try {
                System.err.print("Transaction is being rolled back.");
                con.rollback();
            } 

            catch (SQLException se) {
                se.printStackTrace();
            } 
        } // end of if(con != null) block
    } // end of catch block
    finally {
        // Clean-up code
        con.setAutoCommit(true);

        if (db2Stmt != null) {
            db2Stmt.close();
        }

        if (con !=null){
            con.close();
        }
    } // end of finally block
} // end of insertDB method

private Timestamp shipStnDateFormat(String shipByDate) {
    SimpleDateFormat shipStnDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    SimpleDateFormat standardDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String parsedFinalFormattedDate = null;
    Date finalDate = null;

    if (shipByDate == null)
        return new java.sql.Timestamp(0); // return a dummy value

    else {
        try {
            Date parsedShipByDate = shipStnDateFormat.parse(shipByDate); //
            parsedFinalFormattedDate = standardDateFormat.format(parsedShipByDate); //
            finalDate = standardDateFormat.parse(parsedFinalFormattedDate); //
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return new java.sql.Timestamp(finalDate.getTime());
    } // end of else statement
} // end of shipStnDateFormat method`

我收到此错误... DB2 SQL 错误:SQLCODE=-117、SQLSTATE=42802、SQLERRMC=null、DRIVER=3.6in8.61

显然,我希望它在不引发 SQL 异常的情况下插入所有三列。

另外,这是我用来创建表的 DDL,它显示了每列的数据类型以及是否强制执行 NOT NULL 约束。

第一列“OrderId”是一个标识列,所以我没有为此发出插入参数。

CREATE TABLE SI_Orders (
OrderId INTEGER NOT NULL generated always as identity (start with 0, 
increment by 1, no cache),
SellersNo VARCHAR(20) NOT NULL,
OrderDate Timestamp(0) NOT NULL,
PONo VARCHAR(20),
ShipDatePlanned Timestamp(0) NOT NULL,
CONSTRAINT PK_SI_Orders PRIMARY KEY (OrderId)
);

【问题讨论】:

  • 你查过“SQLCODE=-117, SQLSTATE=42802”是什么意思吗?

标签: java sql db2 prepared-statement sql-insert


【解决方案1】:

您正在设置:

db2Stmt.setString(3, null); // PONo

虽然您的模型说明了该列:

ShipDatePlanned Timestamp(0) NOT NULL,

因此不允许将其设置为 NULL,将参数 3 更新为非 NULL 值应该可以解决此问题。

【讨论】:

  • 谢谢!我输入了一个字符串值“NULL”而不是 null。我仍然收到 SQLException...DB2 SQL 错误:SQLCODE=-180,SQLSTATE=22007,SQLERRMC=null,DRIVER=3.68.61。这意味着“日期时间值的字符串表示的语法不正确。”似乎它期待 ShipDatePlanned 列的输入。如果是这样,为什么它跳过将第三列(PONo)设置为“NULL”?
  • 哦,我的回答中错过了那部分:列需要是时间戳而不是字符串。
  • 好酷...所以我将该字符串设置为时间戳并且它可以工作。我还有另一个问题...在我的创建表 DDL(显示在我的问题中)中,它列出了 OrderId(身份列)、SellersNo、OrderDate 和 PONo。从索引号为 1 的 SellersNo 开始,我希望 PONo 的索引号为 3。所以当我这样做时...db2Stmt.setString(3, "2017-06-01"); 我希望它会尝试将此时间戳放在 PoNo 列中,为什么它将它放在 ShipDatePlanned 列中,我希望它的索引号为 4?
  • ? 的数量决定了db2Stmt.set 中的计数索引。它与您的表或查询的第 x 列无关。
  • 我不确定我是否明白...那我该如何设置 PONo 的值?
【解决方案2】:

要将列添加到查询中,您可以这样做:

sqlInsert = "INSERT into SI_Orders (SellersNo,OrderDate,ShipDatePlanned,PONo,"
        + "Warehouse,OrderType,ShipToName,ShipToAddress1,"
        + "ShipToCity,ShipToProvState,ShipToPostalZip,ShipToCountry" + ") "
        + "VALUES (?, ?, ?,?,'01','DO','bob','a','toronto','ON','h0h0h0',?)";

所以在字符串中的随机位置添加一列,并添加一个?在 VALUES 中将添加该列。

的索引?以 1 开头,仅匹配替换参数的列名。

例如:在此示例中,ShipToCountry 将是索引 5

【讨论】:

  • 我在这个查询中添加了一些列,现在我收到以下错误...com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=3.68.61
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多