2013-10-02 111 views
0

c#的新手。我怎樣才能使用foreach循環的結果。我想將結果插入到我的數據表中。使用foreach循環的結果

提供一個名稱列中插入

foreach (DataRow row in objDataset1.Tables[0].Rows) 
{ 
    string strValue = row["code"].ToString();   
} 

sc.Open(); 
cmd = new SqlCommand("Insert into Table (Code, v1, v2, v3) values('" + strValue + "','" + ckv1.IsChecked.ToString() + "','" + ckv2.IsChecked.ToString() + "', '" + txtv3.Text + "')", sc); 
cmd.ExecuteNonQuery(); 
+6

如果表格中有多行,你希望發生什麼?想必你會插入多行,對吧?請注意,您應該使用參數化的SQL,而不是以這種方式構建SQL。 –

+1

您是否只想從*表中的許多行中* * * strValue'? – crashmstr

+0

**提示**:對於查詢中的值,在使用[SqlParameter](http://www.dotnetperls.com/sqlparameter)更好地使用其他字符串 –

回答

4

你是一個參數化查詢更安全。如果你使用一個using block,它會確保在你的連接結束時處理你的連接。

using(SqlConnection sc = new SqlConnection("yourConnectionString")) 
{ 

    cmd = new SqlCommand("Insert into [tbl] (Code, v1, v2, v3) Values(@code, @v1, @v2, @v3)", sc); 

    cmd.Parameters.Add(new SqlParameter("@code", SqlDbType.VarChar)); 
    cmd.Parameters.Add(new SqlParameter("@v1", SqlDbType.Bit)); 
    cmd.Parameters.Add(new SqlParameter("@v2", SqlDbType.Bit)); 
    cmd.Parameters.Add(new SqlParameter("@v3", SqlDbType.Bit)); 
    sc.Open(); 

    foreach (DataRow row in objDataset1.Tables[0].Rows) 
    { 

     //Assign the values for above parameters here. 
     cmd.Parameters["@code"].Value = row["code"].ToString(); 
     cmd.Parameters["@v1"].Value = valueForV1; 
     cmd.Parameters["@v2"].Value = valueForV2; 
     cmd.Parameters["@v3"].Value = valueForV3; 

     //Execute the command 
     cmd.ExecuteNonQuery(); 
    } 
} 

注:如果V1,V2和V3在數據庫位字段,你應該將它們作爲布爾值,而無需使用的ToString()方法。

+0

謝謝,我會改變這一點。 – user2631662

+0

將「新的SqlCommand」置於循環內部效率低下;所有這些命令對象將在整個過程的整個生命週期中存在,這可能會導致SQL Server出現問題。 – qwerty13579

+0

@ qwerty13579:已經改變了它。謝謝! – Kaf

0

很可能您的C#數據集首先來自Sql數據庫。如果是這樣,要做到這一點,最有效的方法是建立一個單一的查詢:

string sql = "Insert into Table (Code, v1, v2, v3) " + 
       " SELECT code, v1, v2, v3 FROM <this part resembles your original query>"; 
+0

嗨,它不是來自Excel表單。 – user2631662

0
var codes = objDataset1.Tables[0].AsEnumerable() 
         .Select(r => r.Field<string>("code")); 

if (!code.Any()) 
    return; 


var sql = "INSERT INTO Table (Code, v1, v2, v3) VALUES (@code, @v1, @v2, @v3)"; 
sc.Open(); 

foreach(var code in codes) 
{   
    cmd = new SqlCommand(sql, sc); 
    cmd.Parameters.AddWithValue("@code", code); 
    cmd.Parameters.AddWithValue("@v1", ckv1.IsChecked); 
    cmd.Parameters.AddWithValue("@v2", ckv2.IsChecked); 
    cmd.Parameters.AddWithValue("@v3", txtv3.Text); 
    cmd.ExecuteNonQuery(); 
} 

也可以考慮使用Dapper它創建命令,並自動將參數吧:

var v1 = ckv1.IsChecked; 
var v2 = ckv2.IsChecked; 
var v3 = txtv3.Text; 

foreach(var code in codes) 
    sc.Execute(sql, new { code, v1, v2, v3 }); 
+0

這將創建一個新的cmd對象,併爲'codes'的每個記錄添加參數,相反,如果將它們添加到循環之前並在循環內分配值,它會很有效。 – Kaf

+0

@Kaf也許你的代碼效率更高一些,但我認爲這與網絡查詢服務器上的數據庫和IO操作相比真的是微不足道的。保持在一個地方看起來更可讀 –

+1

當然沒有問題,我認爲值得一提。謝謝。 – Kaf

0

把循環內的'新SqlCommand'效率低下;所有這些命令對象將在整個過程的整個生命週期中存在,這可能會導致SQL Server出現問題。嘗試:

(1)循環之外創建的SqlCommand
(2)創建的SqlParameter,循環外再次:

SqlParameter myParam = cmd.Parameters.Add("@myValue", SqlDbType.VarChar); 

(3)在你的循環:

myParam.Value = strValue; 
cmd.ExecuteNonQuery();