【问题标题】:Firebird 3 multiple insertFirebird 3 多插入
【发布时间】:2022-11-13 16:10:37
【问题描述】:

我可以使用 Firebird 3 进行多次插入:

INSERT INTO ECHELONS (N_EMPLOYE, ECHELON, INDICE, "DATE", TYPE_PROMO,NOTE, REMARQUE) VALUES( @P10, @P11, @P12, @P13, @P14, @P15, @P16); 
INSERT INTO ECHELONS (N_EMPLOYE, ECHELON, INDICE, "DATE", TYPE_PROMO,NOTE, REMARQUE) VALUES( @P790, @P791, @P792, @P793, @P794, @P795, @P796);

或者那个:

INSERT INTO ECHELONS (N_EMPLOYE, ECHELON, INDICE, "DATE", TYPE_PROMO,NOTE, REMARQUE) VALUES( @P10, @P11, @P12, @P13, @P14, @P15, @P16),( @P790, @P791, @P792, @P793, @P794, @P795, @P796);

我正在使用 C#,但出现此错误:

错误:

Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 117
INSERT

和 如果我这样做会怎样(性能方面):

 FbTransaction fbTransaction = fb.BeginTransaction() ;
   for (int i = 0; i < length; i++)
    {
          FbCommand fbCommand = new FbCommand();           
          fbCommand.Transaction = fbTransaction;
          fbCommand.Connection = fb;
          fbCommand.CommandText = insertSql;
          fbCommand.ExecuteNonQuery();
   }
   fbTransaction.Commit();

如果多次访问数据库,这会给我带来什么问题吗?

【问题讨论】:

    标签: c# firebird firebird-.net-provider


    【解决方案1】:

    不,您不能直接执行此操作。

    您的第一次尝试是不可能的,因为您只能执行一次声明,而不是两个。除非您使用FbScript 组件,否则您无法进行参数化。

    您的第二次尝试是不可能的,因为不幸的是,Firebird 不支持超过一行的表值构造函数。

    您的选择是:

    1. 准备一条语句并使用ADO.NET provider 9.0.0.0 for Firebird 中引入的批处理执行工具。我对这个 API 本身没有经验,所以我无法演示如何使用它。它也是 - 据我了解 - 现在是一个低级 API,因此它可能需要更多的可用性来改进。

    2. EXECUTE BLOCK 与多个语句一起使用,例如就像是

      execute block (p10 integer = ?, p11 varchar(50) = ?, p20 integer = ?, p21 varchar(50) = ?)
      as
      begin
        insert into sometable(col1, col2) values (:p10, :p11);
        insert into sometable(col1, col2) values (:p20, :p21);
      end
      

      第二个选项有许多限制,例如所有参数的大小加起来不能超过 64 KB,因此如果要插入非常宽的行,这将限制您可以在单个块中插入的行数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-05
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2011-04-12
      相关资源
      最近更新 更多