2017-03-28 21 views
3

如果我想將多個對象插入到SQL Server數據庫看來我必須這樣做:INSERT INTO有沒有一種折衷方式?

 using (var command = new SqlCommand(@"INSERT INTO Table1 (
      Param_1, 
      Param_2, 
      Param_3, 
      ... 
      ) 
      VALUES (
      @param1, 
      @param2, 
      @param3, 
      ... 
      )",conn)) 
      { 
       command.Params.Add("@param1",...); 
       command.Params.Add("@param2",...); 
       command.Params.Add("@param3",...); 
       ... 
       foreach(var o in objects) 
       { 
       command.Params["@param1"].Value = o.Param1; 
       command.Params["@param2"].Value = o.Param2; 
       command.Params["@param3"].Value = o.Param3; 
       ... 
       command.ExecuteNonQuery(); 
       } 
      } 

只是把這個在一起有我拉我的頭髮,我有28個字段的表。我必須在4個不同的時間寫出長列表,只有最小的差異(數據庫字段名稱可能使用不同的命名約定)。這看起來很瘋狂;有沒有更簡單的方法?

實體框架不適合我這裏,這將是我的第一選擇,我必須滾動代碼。

+3

你可以使用[Dapper](https://github.com/StackExchange/Dapper)嗎? – juharr

+0

我從來沒有聽說過它;儘管如此,我並不太熱衷於添加其他依賴項。 –

+0

我習慣於使用xml來傳遞具有許多屬性的對象或列表對象。您可以將C#中的對象序列化爲字符串並在sql中反序列化它 – TriV

回答

3

如果你完全反對使用外部庫,那麼這個怎麼樣?

void Insert (Dictionary <string, SqlType> cols, Object [] objects) 
{ 
    string colNames = string.Join (",", cols.Keys); 
    string paramNames = string.Join (",", cols.Keys.Select (c=>"@"+c)); 

    using (var command = new SqlCommand(@"INSERT INTO Table1 (" + colNames + 
      ") VALUES (" + paramNames + ")",conn)) 
    { 
      foreach (var col in cols) 
      { 
      command.Params.Add("@" + col.Key, col.Value); 
      } 

      foreach(var o in objects) 
      { 
      // Here you would have to list them all unless 
      // your object o is a Dictionary<string, object> or a DataRow. 
      command.Params["@param1"].Value = o.Param1; 
      command.Params["@param2"].Value = o.Param2; 
      command.Params["@param3"].Value = o.Param3; 
      ... 
      command.ExecuteNonQuery(); 
      } 
    } 
} 
+0

如果您要創建這樣的字典,爲什麼不創建一個DataTable並使用SqlBulkCopy或TVP?這將避免循環,指定參數並提高性能 –

相關問題