【问题标题】:Batching in ADO.NET without DataAdapters在没有 DataAdapters 的 ADO.NET 中进行批处理
【发布时间】:2008-12-31 09:56:12
【问题描述】:

是否可以在 ADO.NET 中实现多个存储过程调用的批处理(执行更新/删除)而不借助 DataAdapters?

【问题讨论】:

    标签: ado.net batching


    【解决方案1】:

    您可以尝试使用 System.Data.SqlClient.SqlCommandSet。它实际上是内部的,但是Ayende made a wrapper to make it public

    代码目前托管在sourceforge

    【讨论】:

      【解决方案2】:

      你的 SQL 文本可以包含多个命令。如果返回多个结果集,则可以使用 DataReader 并使用 NextResult 函数。我经常做的是将要作为嵌入式资源执行的 SQL 存储,然后加载该文本。如果它包含参数,则像平常一样设置参数。

      例如,我有一个文件:

      UPDATE dbo.QuotePricedLineItem
      SET fkQuoteVendorLineSet = NULL
      FROM dbo.QuotePricedLineItem qpli
      INNER JOIN dbo.QuoteLineItem qli ON qpli.Id = qli.Id
      WHERE qli.fkQuote = @quoteId AND qpli.fkQuoteVendorLineSet = @ciscoConfigId
      
      DELETE CiscoQuoteLineItem
      FROM CiscoQuoteLineItem cqli
      INNER JOIN QuoteLineItem qli ON cqli.Id = qli.Id
      WHERE qli.fkQuote = @quoteId AND cqli.fkCiscoQuoteVendorLineSet = @ciscoConfigId
      

      我这样执行:

      using (SqlConnection conn = DbUtils.CreateConnection() as SqlConnection)
      {
          conn.Open();
      
          SqlCommand cmd = conn.CreateCommand();
          cmd.CommandText = MvcApplication.GetResource("SQL.DemoteCiscoQuoteLineItems.sql");
          cmd.Parameters.AddWithValue("@quoteId", q.Id);
          cmd.Parameters.AddWithValue("@ciscoConfigId", configSetId);
          cmd.ExecuteNonQuery();
      }
      

      请注意,MvcApplication.GetResource 不是内置函数 - 这是您必须编写的函数...这是我的:

      public static string GetResource(string p)
      {
          Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("CortexQuoting.Res." + p);
          if (s == null) return null;
      
          StreamReader sw = new StreamReader(s);
          string ss = sw.ReadToEnd();
          sw.Close();
          return ss;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-12-13
        • 1970-01-01
        • 2019-05-26
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        相关资源
        最近更新 更多