3

我正在尝试使用 C# 代码将多行插入 DB2 数据库,如下所示:

string query = 
"INSERT INTO TESTDB2.RG_Table (V,E,L,N,Q,B,S,P) values" +
"('abc', 'def', '2009-03-27 12:01:19', 'ghi', 'jkl', NULL, NULL, NULL)," +
"('abc', 'def', '2009-03-27 12:01:19', 'ghi', 'jkl', NULL, NULL, NULL)";

DB2Command cmd = new DB2Command(query, this.connection, this.transaction);

cmd.ExecuteNonQuery();

如果我在第一组值之后停止构建查询字符串,它会在没有错误的情况下执行。尝试使用此方法加载多个值会导致以下错误:

Upload error : ERROR [42601] [IBM][DB2] SQL0104N  
An unexpected token "," was found following "".  
Expected tokens may include:  "<END-OF-STATEMENT>".  SQLSTATE=42601

SQL 语法与我在其他地方读到的相匹配, IBM 的文档给出了这个例子:

cmd = conn.CreateCommand();
cmd.Transaction = trans;

cmd.CommandText =
"INSERT INTO company_a VALUES(5275, 'Sanders', 20, 'Mgr', 15, 18357.50), " +
"(5265, 'Pernal', 20, 'Sales', NULL, 18171.25), " +
"(5791, 'O''Brien', 38, 'Sales', 9, 18006.00)";

cmd.ExecuteNonQuery();

谁能解释什么可以解释这一点?

4

4 回答 4

2

我意识到这是一个非常古老的问题,但到目前为止,还没有一个答案能找到问题的真正根源。由于他不能使用多个 VALUES 子句,我猜他是在不支持的 z/OS 上。有关更多信息,请参阅我的其他答案

不过,还有一个替代方案,因为他似乎使用的是 .NET,这是驱动程序的“链接”能力。这允许您批量处理多个插入/更新/删除,当您“结束”您的链时,驱动程序会立即发送所有语句。这是一些示例代码:

<!-- language: lang-cs --> //Code parser seems to be going crazy here...
public void InsertToDatabase(IEnumerable<Row> rows)
{
    using (var conn = new DB2Connection())
    using (var trans = conn.BeginTransaction())
    using (var cmd = conn.CreateCommand())
    {
        cmd.Transaction = trans;
        cmd.CommandText =
            "INSERT INTO company_a VALUES " +
            "(@field1,@field2,@field3,@field4,@field5,@field6)";

        conn.BeginChain();
        foreach (var row in rows)
        {
            cmd.Parameters.Clear();
            cmd.Parameters.Add("@field1", row.Field1);
            cmd.Parameters.Add("@field2", row.Field2);
            cmd.Parameters.Add("@field3", row.Field3);
            cmd.Parameters.Add("@field4", row.Field4);
            cmd.Parameters.Add("@field5", row.Field5);
            cmd.Parameters.Add("@field6", row.Field6);
            cmd.ExecuteNonQuery();
        }
        conn.EndChain();
        trans.Commit();
    }
}

如果 DB2 抛出任何异常,您只会在运行时得到它EndChain,而且它们都会同时出现。

于 2016-01-13T18:08:12.413 回答
0

您是否尝试过通过命令行插入?根据此链接,语法似乎是正确的

于 2009-04-20T15:02:23.293 回答
0

您的语法看起来大致正确。

  • 它可以从 cli 中工作吗?
  • 你看过 JDBC 批量更新吗?我认为您会发现它几乎一样快,并且更具可读性和可支持性。
于 2009-07-20T19:37:52.253 回答
0

如果您指定行列表,我很确定插入多行不起作用;在这种情况下

(V,E,L,N,Q,B,S,P)

要插入多行,您必须按照表列的本机顺序给出值。

尝试将您的 SQL 修改为:

string query = "INSERT INTO TESTDB2.RG_Table values" +   
"('abc', 'def', '2009-03-27 12:01:19', 'ghi', 'jkl', NULL, NULL, NULL)," +
"('abc', 'def', '2009-03-27 12:01:19', 'ghi', 'jkl', NULL, NULL, NULL)"; 
于 2009-12-07T14:50:08.643 回答