2010-07-28 8 views
0

웹 양식을 데이터베이스에 삽입하므로 매개 변수화 된 쿼리를 사용하고 있습니다. CheckBoxList가 있습니다. CheckBoxList를 반복하고, 확인 된 모든 항목 (many-to-many)에 대해 insert 문을 작성하고, 매개 변수화 된 상태로 유지하고 한 번에 실행할 수 있습니까?반복 매개 변수화 된 쿼리

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'의 한 세트에 대한 삽입을 생성해야합니까? – tzaman

+0

@tzaman : 아니요, 각 체크 된 항목은 다음과 같은 INSERT 문을 만들어야합니다 :'INSERT INTO phones_resources (phone_id, resource_id) VALUES (@phone_id, @resource_id);'. – jeffcook2150

+0

확인. 따라서,'ListItem'이 주어지면'phone_id, resource_id'는 어디에서 얻을 수 있습니까? – tzaman

답변

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 Framework (아마도 Mono 일 가능성이 높습니다.)를 망칠 기회가 생겼을 때 확인해 보겠습니다. – jeffcook2150

+0

@cookiecaper - 오신 것을 환영합니다! 나는 최근에 비슷한 상황에 직면했다. 필자는 매개 변수 이름/값의'Dictionary '를 취한'AddFromDict'라는 확장 메소드를 SqlParameterCollection'에 추가하여이 접근법을 일반화했습니다. 그래서 이제'parameters' dict을 채운 다음'cmd.Parameters.AddFromDict (parameters);'를 호출합니다. – tzaman

관련 문제