2010-06-25 70 views
4

我遇到了有關使用Subsonic3批量插入多行的問題。我的開發環境包括:無法在Subsonic3中批量插入,錯誤爲「必須聲明標量變量...」

1. Visual Studio 2010, but use .NET 3.5 
2. Active Record Mode in SubSonic 3.0.0.4 
3. SQL Server 2005 express 
4. Northwind sample database 

我正在使用Active Reecord模式將多個「Product」插入表「Products」中。如果我逐一插入行,可以調用「aProduct.Add()」或調用「Insert.Execute()」多次(就像下面的代碼一樣),它可以正常工作。

 private static Product[] CreateProducts(int count) 
     { 
      Product[] products = new Product[count]; 
      for (int index = 0; index < products.Length; ++index) 
      { 
       products[index] = new Product 
       { 
        ProductName = string.Format("cheka-test-{0}", index.ToString()), 
        Discontinued = (index % 2 == 0),       
       }; 
      } 
      return products; 
     } 
     private static void SucceedByMultiExecuteInsert() 
     { 
      Product[] products = CreateProducts(2); 

      // -------------------------------- prepare batch 
      NorthwindDB db = new NorthwindDB(); 

      var inserts = from prod in products 
          select db.Insert.Into<Product>(x => x.ProductName, x => x.Discontinued).Values(prod.ProductName, prod.Discontinued); 

      // -------------------------------- batch insert 
      var selectAll = Product.All(); 
      Console.WriteLine("--- before total rows = {0}", selectAll.Count().ToString()); 

      foreach (Insert insert in inserts) 
       insert.Execute(); 

      Console.WriteLine("+++ after inserting {0} rows, now total rows = {1}", 
       products.Length.ToString(), selectAll.Count().ToString()); 
     } 

,但如果我用 「BatchQuery」 像下面的代碼,

private static void FailByBatchInsert() 
    { 
     Product[] products = CreateProducts(2); 

     // -------------------------------- prepare batch 
     NorthwindDB db = new NorthwindDB(); 
     BatchQuery batchquery = new BatchQuery(db.Provider, db.QueryProvider); 

     var inserts = from prod in products 
         select db.Insert.Into<Product>(x => x.ProductName, x => x.Discontinued).Values(prod.ProductName, prod.Discontinued); 

     foreach (Insert insert in inserts) 
      batchquery.Queue(insert); 

     // -------------------------------- batch insert 
     var selectAll = Product.All(); 
     Console.WriteLine("--- before total rows = {0}", selectAll.Count().ToString()); 

     batchquery.Execute(); 

     Console.WriteLine("+++ after inserting {0} rows, now total rows = {1}", 
      products.Length.ToString(), selectAll.Count().ToString()); 
    } 

那麼它失敗,出現異常: 「 未處理的異常信息:System.Data.SqlClient.SqlException:必須聲明標量變量 「@ins_ProductName」。 必須聲明標量變量 「@ins_ProductName」。

請給我一些幫助來解決這個問題。非常感謝。

回答

0

我也遇到了這個問題。如果你看一下查詢它試圖運行,你會看到它做這樣的事情(這是不實際的代碼,但你會得到點):

exec_sql N'insert into MyTable (SomeField) Values (@ins_SomeField)',N'@0 varchar(32)','@0=SomeValue' 

出於某種原因,它定義的參數在查詢中使用"@ins_"+FieldName,但隨後按順序傳遞參數。我還沒有確定爲什麼/何時執行此操作的模式,但在此開發週期中,我失去了足夠的時間用SubSonic嘗試正確診斷問題。

我實現的解決方法將涉及到從github下載3.0.0.4源代碼並對Insert.cs的第179行進行更改。

凡讀

ParameterName = _provider.ParameterPrefix + "ins_" + columnName.ToAlphaNumericOnly(), 

改變它

ParameterName = _provider.ParameterPrefix + Inserts.Count.ToString(), 

似乎做的伎倆我。對於您的解決方案,我不作任何擔保,明示或暗示。它確實爲我工作,但你的里程可能會有所不同。

我還應該注意到,在第181行和第194行的Update.cs中也有類似的「更新」語句的邏輯,但是我還沒有給出這些問題。

老實說,我不認爲SubSonic已經準備好了黃金時段,這真是一種遺憾,因爲我真的很喜歡Rob設定它的方式。也就是說,現在在我的產品中可以更好或更差,因此您可以充分利用您的產品。

+0

我已經上傳示例代碼來說明這個問題在http://github.com/andymeadows/SubSonic-Defect-Help – andymeadows 2010-07-13 04:06:15