2013-08-14 1 views
0

저는 C#과 매개 변수를 SQL로 전달하는 것에 익숙하지만 구현하는 것이 중요하다는 것을 알고 있습니다.SQL Server에서 매개 변수와 함수를 모두 사용하는 방법?

시나리오는 다음과 같습니다

이미 시스템에 내장 된 기능을 가지고 있지만에게 전달하는 매개 변수를 사용할 수 있도록하기 위해 편집하는 방법을 모르겠어요. 내 기능은 INSERT 또는 UPDATE를 통해 편집 할 수

은 다음과 같습니다 내 기능을 사용하기

namespace SQLFunc 
    { 
    class SQLClass 
    { 

    public void SQLEdit(string var_SQLCommand) 
    { 
     using (SqlConnection myConn = new SqlConnection(this.SQLConnectString)) 
     using (SqlCommand var_command = new SqlCommand(var_SQLCommand, myConn)) 
     { 
      myConn.Open(); 
      try 
      { 
       var_command.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("An error occurred: " + ex.Message + " using SQL Query: " + var_SQLCommand, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
      finally 
      { 
       myConn.Close(); 
      } 
     } 
    } 
    ... 

내 일반적인 명령은 다음과 같습니다

: 매개 변수를 사용하여

using SQLFunc.SQLClass 

    .... 

    //command to variable 
    var_Command = "UPDATE tbl_Table SET fld_Active = 'YES' WHERE fld_IDNo = " + var_A; 

    //execute function 
    var_SQLClass.SQLEdit(var_Command); 

, 난 코드를 가고 싶어

using SQLFunc.SQLClass 

    .... 

    //command to variable 
    var_Command = "UPDATE tbl_Table SET fld_Active = 'YES' WHERE fld_IDNo = @var_A_"; 

    // need to pass this entire line after the SQLCommand in the function SQLEdit 
    var_Command.Parameters.AddWithValue("var_A_", var_A); 

    var_SQLClass.SQLEdit(var_Command); 

필자는 함수 전달 매개 변수를 활용할 수 있기를 원했습니다. 변수 var_A를 전달할 수 있지만 필드 수가 변경 될 때마다 함수 코드를 변경하지 않고도 한 필드 (업데이트 또는 삽입) 또는 10 필드 (업데이트 또는 삽입)에 대해 작동해야하는 것처럼 적응성을 만족시키기 위해 내 코드를 원했습니다.

달성 가능합니까? 그렇다면 어떻게?

+0

SQLParameters 컬렉션을 만들어 함수에 전달할 수 있습니다. 함수를 호출하려면 다음과 같습니다. var_SQLClass.SQLEdit (var_Command, var_Parameters); 함수 내부에서 var_Command.Parameters.Add() 오버로드를 사용하여 콜렉션을 추가하십시오. – andrewb

+0

당신은 당신의 UPDATE 명령에서'fldIDNo'를 제외하고 다른 필드를 가질 수 있습니까? 아니면 @var_A_에 대해 여러 값을 전달할 수 있다고 말하는 것입니까? – Edper

+0

@ andrew-buchan 당신은 배열과 같은 뜻인가요? –

답변

1

이 방법은 다음과 같습니다

은 내가 메모리에서했고, 테스트하지 않았습니다 다음에, 유사한 무언가를 당신을위한 매개 변수 개체를 만들 수있는 도우미 함수를 작성할 수, 일을 덜 장황 만들려면 나는 그것을 할 것이다.

public class SqlClass 
{ 
    public void ExecuteNonQuery(string sqlStatement, Dictionary<string, object> parameters) 
    { 
     using (SqlConnection connection = new SqlConnection(this.ConnectionString)) 
     { 
      connection.Open(); 

      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandType = System.Data.CommandType.Text; 
       command.CommandText = sqlStatement; 

       foreach(var keyValuePair in parameters) 
       { 
        command.Parameters.Add(new SqlParameter(keyValuePair.Key, keyValuePair.Value)); 
       } 

       command.ExecuteNonQuery(); 

      } 
     } 
    } 
} 

SqlClass.ExecuteNonQuery() 호출이 이와 유사합니다.

Dictionary<string, object> parameters = new Dictionary<string, object> 
{ 
    { "@fld_Active", "Yes" }, 
    { "@fld_IDNo", 1 } 
}; 

SqlClass sql = new SqlClass(); 
sql.ExecuteNonQuery("UPDATE tbl_Table SET fld_Active = @fld_Active WHERE fld_IDNo = @fld_IDNo", 
    parameters); 
1

이 마음에 드십니까?

public void insert(string sql,Dictionary<stirng,object> parameters){ 
    using (SqlConnection myConn = new SqlConnection(this.SQLConnectString)) 
    using (SqlCommand var_command = new SqlCommand(var_SQLCommand, myConn)) 
    { 
     myConn.Open(); 
     try 
     { 
      foreach(string name in parameters.Keys){ 
       var_Command.Parameters.AddWithValue(name, parameters[name]); 
      }  
      var_command.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("An error occurred: " + ex.Message + " using SQL Query: " + var_SQLCommand, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
     finally 
     { 
      myConn.Close(); 
     } 
    } 
} 
+0

목록 <흔들림, 대상>? 당신은 사전을 의미합니까? – fcuesta

+0

어떻게 구현합니까? 두 변수 전달을 사용하여 샘플 코드를 제공 할 수 있습니까? –

+0

죄송합니다. 다중 매개 변수가 필요한 사전입니다. 감사합니다. fcuesta! – sheauren

0

내가 제대로 이해하면, 당신은 params은 "그냥 작동 것"이라고 및 쿼리의 오른쪽 장소에 연결 얻을 같은 몇 가지 기능 SQLEdit(command, /* params */)을하고 싶습니다. 그래?

그렇다면 너무 까다 롭습니다. 매개 변수가있는 쿼리를 사용하려면 SqlParameter 개의 개체를 제공해야합니다. 그들은 자동으로 추론 할 수없는 인수의 SQL Server 데이터 유형을 알아야합니다. 예를 들어 DateTime은 시간, 날짜 시간 또는 날짜 시간 중 하나 일 수 있습니다. 문자열은 char, nchar, varchar, nvarchar, text, ntext ...이 될 수 있습니다.

최상의 (가장 자세한 경우) 내기는 paramsparams SqlParameter parameters과 같은 것으로 만들고 사용되는 곳에서 개별 매개 변수를 직접 구성하는 것이 좋습니다. 자신의 매핑 알고리즘을 만들려고하면 값 비싼 대가를 치르게 될 것입니다.

편리하게 사용하려면 다양한 ORM (Entity Framework, Dapper 등)을 사용하십시오. 원시 SQL의 성능을 원하면 코드를 작성할 준비를하십시오. 여기

public static SqlParameter Create(string name, SqlDbType type, object value) 
{ 
    var p = new SqlParameter(); 
    p.ParameterName = name; 
    p.SqlDbType = type; 

    // If type is a fixed-length type, maybe set the correct string length here 

    if (value == null) 
    { 
     p.SqlValue = DBNull.Value; 
    } 
    else 
    { 
     p.SqlValue = value; 
    } 

    return p; 
} 
+0

[Microsoft] (http://msdn.microsoft.com/en-us/library/ee730344.aspx)조차 Linq to SQL을 더 이상 권장하지 않습니다. –

+0

솔직히, 요즘 MS가 제안하는 것은 무엇이든 나는 반대를 선호하는 경향이 있습니다. Entity Framework는 필자 경험에서 훨씬 더 높은 PITA 요소를 가지고 있습니다. 어쨌든 요점. – Ben

관련 문제