2013-08-16 4 views
0

테이블 제품에 레코드를 삽입하는 코드가 있습니다.코드를 재사용하여 여러 WinFoms의 다중 테이블에서 레코드를 삽입/삽입 할 수 있습니까

int insertRecordIntoProduct() 
{ 
    try 
    { 
     if (con.State == ConnectionState.Closed) 
     { 
      con.Open(); 
     } 
     string insQuery = "insert into product_details (prod_name,prod_desc,prod_status,start_date,end_date,ref_num,ror) "+ 
         "values(@p_name,@p_desc,@status,@sdate,@edate,@filenum,@ror)"; 

    SqlCommand insertCmd = new SqlCommand(insQuery, con); 

    insertCmd.Parameters.Clear(); 
    insertCmd.Parameters.AddWithValue("@p_name", txtProdName.Text); 
    insertCmd.Parameters.AddWithValue("@p_desc", txtProdDesc.Text); 

    insertCmd.Parameters.AddWithValue("@sdate", (StartDatePicker.Value.Date)); 
    insertCmd.Parameters.AddWithValue("@edate", (EndDatePicker.Value.Date)); 
    insertCmd.Parameters.AddWithValue("@filenum", txtBoxFileNum.Text); 

    int r= insertCmd.ExecuteNonQuery(); 
    return r; 
    } 
} 

이 코드는 정상적으로 작동합니다. 내 문제는 내가 10-12 wiforms 있고 각각의 양식을 삽입/다른 테이블에 동일한 데이터베이스에 레코드를 업데이 트해야합니다. 이제 나는 위의 코드를 어떤 식 으로든 사용하여 다양한 형식의 레코드를 삽입/업데이트 할 수 있는지 알고 싶습니다. (예 : 내 CustomerDetail 양식에는 15 개의 TextBox가 있고 중개 양식에는 8 개의 TexBox가 ​​있습니다.) 또는 각 양식에 대해 동일한 작업을 수행해야합니다 (많은 시간 소요). 최선의 방법으로이 작업을 수행 할 수있는 다른 방법이 있는지 알려주십시오.

+0

모두 동일한 매개 변수를 삽입해야합니까? – Ehsan

+0

@EhsanUllah - 영업 이익은 형태 (매개 변수로 사용되는 표시) 텍스트 상자의 다른 번호를 가지고 자신의 질문에 표시된, 그래서 나는 당신의 질문에 대한 대답이 더 있음을 의심하지 않을 것이다. – Tim

+0

yea right Tim .. 모두 다른 매개 변수를 가지고 있습니다 ... – Vimdav

답변

1

이 작업을 수행하는 한 가지 방법은 모든 양식에서 사용되는 클래스를 만드는 것입니다.이 클래스에는 업데이트/삽입에 사용할 수있는 방법이 하나 있습니다. 데이터).

예를 들어

:

public static class SqlHelper 
{ 

    public static int InsertUpdate(string connectionString, string sql, Dictionary<string, object> parameters) 
    { 

     int rows = 0; 

     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 

      sqlCommand cmd = new SqlCommand(sql, con); 
      cmd.CommandType = CommandType.Text; 

      foreach (string key in parameters.Keys) 
      { 
       cmd.Parameters.AddWithValue(key, parameters[key]); 
      } 

      rows = cmd.ExecuteNonQuery(); 
     } 

     return rows; 
    } 
} 

어떤이 코드가하는 것은 연결 문자열, SQL 명령에 대한 문자열 값, 키로서 매개 변수 이름 (들)을 가지고 사전에 대한 문자열 값을 취 및 해당 값.

그런 다음 SqlConnection을 만들고 명령을 만들고 매개 변수 사전을 반복하며 사전에있는 각 매개 변수의 새 매개 변수를 명령에 추가합니다.

마지막으로 쿼리를 실행하고 영향을받는 행을 반환합니다.

다음과 같이이 메소드를 호출 할 수 있습니다 (귀하의 예제 코드 기준) : 기본이되는 메소드 호출에서 오류를 처리하는 방법이 있으므로

int rowsAffected = 0; 

try 
{ 
    Dictionary<string, object>() params = new Dictionary(string, object>(); 
    params.Add("@p_name", txtProdName.Text); 
    params.Add("@p_desc", txtProdDesc.Text); 
    params.Add("@sdate", StartDatePicker.Value.Date); 
    params.Add("@edate", EndDatePicker.Value.Date); 
    params.Add("@filenum", txtBoxFileNum.Text); 

    string sql = "insert into product_details" +  
       "(prod_name,prod_desc,prod_status,"+ 
       "start_date,end_date,ref_num,ror) "+ 
       "values(@p_name,@p_desc,@status,@sdate,@edate,@filenum,@ror)"; 

    rowsAffected = SqlHelper.InsertUpdate(connectionString, sql, params); 
} 
catch (Exception ex) 
{ 
    // Do something with the error; 
} 

나는 시도의 catch 블록에서 전화를 포장 . 사전이 작성되고 sql 문자열이 작성된 다음 rowsAffected에 정적 도우미 메소드 (SqlHelper.InsertUpdate)가 리턴 한 값이 지정됩니다. 오류가 발생하면

, 그것은 잡힌 당신은 그것을 (, 메시지 상자 등을 기록)

이 예제는 클래스 수준에서 가장 가능성이 이미 작성 될 connectionString 문자열을 (기대와 뭔가를 할 수).

사전을 사용하여 매개 변수를 전달하기 때문에 각 호출에 대해 적절한 수의 매개 변수를 사용하여 SQL 명령과 일치시키는 새 사전을 만들어야합니다 (게시 된 코드 예제에서 @ror에 대한 내용이 없으므로 포함하지 않았습니다.)

또한 데이터를 선택하는 SqlHelper 클래스에 두 번째 정적 메서드를 추가 할 수 있습니다 -이 경우 당신은 반환 할 수있는 당신이 사용하는 것이 바람직 내용에 따라 DataTable, DataSet 또는 SqlDataReader, - 또는 각각 하나 개의 방법이있다.

+0

. 이것이 내가 원하는거야 . 한 번 더 생각하면 사전 대신 대체 목록 을 사용할 수 있습니까? – Vimdav

+0

@ Vimdav - 당신은'List '을 사용할 수 있지만 융통성을 잃을 수 있습니다 - 두 개의'List '(하나는 매개 변수 이름으로, 다른 하나는 매개 변수 값으로 사용)이거나 명시 적으로 매개 변수 이름이나 매개 변수 값을 사용하면 간단한 foreach 루프로 다양한 수의 매개 변수 (값이있는)를 추가 할 수 없습니다. 사전은 귀하의 요구에 훨씬 더 적합합니다. – Tim

+0

ok @Tim 그러면 사전을 사용할 것입니다. – Vimdav