2010-07-28 82 views
0

我將Web表單插入到數據庫中,因此使用參數化查詢。我有一個CheckBoxList。我怎樣才能迭代CheckBoxList,爲每一個檢查的事物(多對多)創建一個插入語句,並保持這個參數化和執行一舉?迭代上的參數化查詢

我現在有這個權利:

string query = "INSERT INTO resources (url, submitted_by, author_name) VALUES (@url, @submitted_by, @author_name);"; 
foreach (ListItem li in CheckBoxList1.Items) 
    { 
     if (li.Selected = true) 
     { 
      query += "; INSERT INTO "; 
     } 
    } 
    SqlCommand cmd = new SqlCommand(query, conn); 
    cmd.Parameters.AddWithValue("@url", TextBox1.Text); 
    cmd.Parameters.AddWithValue("@submitted_by", TextBox2.Text); 
    cmd.Parameters.AddWithValue("@author_name", TextBox3.Text); 

    try 
    { 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     Label1.Text = "Added to database."; 
    } 

正如你可以看到它的未完成。有什麼建議麼?

+0

每個選中的項目都需要爲一組'url,submitted,author'生成一個insert? – tzaman 2010-07-28 21:27:38

+0

@tzaman:不,每個檢查的項目都需要創建一個像這樣的INSERT語句:'INSERT INTO phones_resources(phone_id,resource_id)VALUES(@phone_id,@resource_id);'。 – jeffcook2150 2010-07-28 21:29:35

+0

好的。所以,給定一個'ListItem'你在哪裏得到相關的'phone_id,resource_id'? – tzaman 2010-07-28 21:31:14

回答

1

你可以使用LINQ來爲每個項目生成唯一命名的參數您的收藏中,然後加入後,相關的值:

var builder = new StringBuilder(); 
var listParams = CheckBoxList1.Items 
        .Where(li => li.Selected) 
        .Select(li, idx => new 
        { 
         PhoneString = String.Format("@phone_id{0}", idx), 
         PhoneValue = GetPhoneId(li), 
         ResourceString = String.Format("@resource_id{0}", idx), 
         ResourceValue = GetResourceId(li) 
        }; 
foreach (var param in listParams) 
{ 
    builder.AppendFormat("INSERT INTO phones_resources (phone_id, resource_id) 
          VALUES ({0}, {1});", 
          param.PhoneString, param.ResourceString); 
} 
SqlCommand cmd = new SqlCommand(builder.ToString(), conn); 
foreach (var param in listParams) 
{ 
    cmd.Parameters.AddWithValue(param.PhoneString, param.PhoneValue); 
    cmd.Parameters.AddWithValue(param.ResourceString, param.ResourceValue); 
} 

我假設你有得到來自任何給定的相關phone_id, resource_id某種方式ListItem - 您可以將它放在我已放置佔位符Get___函數的位置。

注意:切換到StringBuilder - 這比建立重複的+=的字符串要好得多。

+0

謝謝。我使用.NET 2.0,但我已經適應了這一點。我希望我不會這樣做,但它運行良好,並且在你的鼓勵後並沒有那麼糟糕。 LINQ語句是一個很好的參考,當我有機會混淆新的.NET框架(實際上可能是Mono)時,我會嘗試記住檢查它。 – jeffcook2150 2010-07-29 09:14:49

+0

@cookiecaper - 不客氣!最近我自己也面臨類似的情況;我最終通過在名爲AddFromDict的'SqlParameterCollection'上添加了一個擴展方法來推廣這種方法,該方法使用了參數名稱/值的'Dictionary '並將它們全部添加。所以現在我只填充一個'parameters'字典,然後調用'cmd.Parameters.AddFromDict(parameters);':) – tzaman 2010-07-29 09:34:30