복붙노트

[SQL] 어떻게 SQL에서 문을위한 SqlParameter에로 목록 <문자열>을 번역 하는가? [복제]

SQL

어떻게 SQL에서 문을위한 SqlParameter에로 목록 <문자열>을 번역 하는가? [복제]

나는 SqlParameter에 함께에서 문을 수행하는 방법에 혼동 될 것으로 보인다. 지금까지 나는 다음과 같은 코드가 있습니다 :

cmd.CommandText = "Select dscr from system_settings where setting in @settings";
cmd.Connection = conn;
cmd.Parameters.Add(new SqlParameter("@settings", settingList));

reader = cmd.ExecuteReader();

settingsList은 목록 <문자열>입니다. cmd.ExecuteReader ()가 호출 될 때, 나는 인해 "알려진 공급자 유형"에 목록 <문자열> 매핑 할 수없는에 ArgumentException이 얻을.

어떻게 (안전) SqlCommands과에서 쿼리를 수행합니까?

해결법

  1. ==============================

    1.당신이 뭔가를 시도 할 수 있습니다 :

    당신이 뭔가를 시도 할 수 있습니다 :

    string sql = "SELECT dscr FROM system_settings WHERE setting IN ({0})";
    string[] paramArray = settingList.Select((x, i) => "@settings" + i).ToArray();
    cmd.CommandText = string.Format(sql, string.Join(",", paramArray));
    
    for (int i = 0; i < settingList.Count; ++i)
    {
        cmd.Parameters.Add(new SqlParameter("@settings" + i, settingList[i]));
    }
    
  2. ==============================

    2.당신은 멀티 반환 매개 변수를 전달하려고하는, 그 SQL 구문은 당신이 무엇을 기대하지 않을 것입니다 나타납니다. 당신은 테이블 값 매개 변수를 전달 할 수 있습니다.

    당신은 멀티 반환 매개 변수를 전달하려고하는, 그 SQL 구문은 당신이 무엇을 기대하지 않을 것입니다 나타납니다. 당신은 테이블 값 매개 변수를 전달 할 수 있습니다.

    이 읽기 : http://www.sommarskog.se/arrays-in-sql.html#iter-list-of-strings

    특히 : http://www.sommarskog.se/arrays-in-sql-2008.html#ListSqlDataRecord

    private static void datatable_example() {
    
       string [] custids = {"ALFKI", "BONAP", "CACTU", "FRANK"};
    
       DataTable custid_list = new DataTable();
       custid_list.Columns.Add("custid", typeof(String));
    
       foreach (string custid in custids) {
          DataRow dr = custid_list.NewRow();
          dr["custid"] = custid;
          custid_list.Rows.Add(dr);
       }
    
       using(SqlConnection cn = setup_connection()) {
          using(SqlCommand cmd = cn.CreateCommand()) {
    
             cmd.CommandText =
               @"SELECT C.CustomerID, C.CompanyName
                 FROM   Northwind.dbo.Customers C
                 WHERE  C.CustomerID IN (SELECT id.custid FROM @custids id)";
             cmd.CommandType = CommandType.Text;
    
             cmd.Parameters.Add("@custids", SqlDbType.Structured);
             cmd.Parameters["@custids"].Direction = ParameterDirection.Input;
             cmd.Parameters["@custids"].TypeName = "custid_list_tbltype";
             cmd.Parameters["@custids"].Value = custid_list;
    
             using (SqlDataAdapter da = new SqlDataAdapter(cmd))
             using (DataSet        ds = new DataSet()) {
                da.Fill(ds);
                PrintDataSet(ds);
             }
          }
       }
    }
    
  3. ==============================

    3.나는 지금과 같은 매개 변수를 만들려면 내 자신의 함수를 사용

    나는 지금과 같은 매개 변수를 만들려면 내 자신의 함수를 사용

    public void SomeDataFunction() {    
        ArrayList params = GetParameters(someEntity);
        CommandObject.Parameters.AddRange(parameters.ToArray());
    }
    
    public static ArrayList GetParameters(ISomeEntity entity) {
        ArrayList result = new ArrayList {                  
                OleDbUtility.NewDbParam("@Param1", OleDbType.Integer, , entity.Parameter1),
                OleDbUtility.NewDbParam("@Param2", OleDbType.VarChar, 9, entity.Parameter2),
            }
    }
    
    public static OleDbParameter NewDbParam(string parameterName, OleDbType dataType,
                        int size, object value) {
        OleDbParameter result = new OleDbParameter(parameterName, dataType, size, string.Empty);
        result.Value = value;
        return result;
    }
    
  4. ==============================

    4.당신은 SQL Server 2008 이상을 사용하는 경우, 당신은 테이블 반환 매개 변수를 사용할 수있다 - 이것은 당신이 매개 변수로 값의 테이블에 전달할 수 있습니다. .NET에서 당신은 "구조화"형 SqlParameter에 정의 및 구현을 IEnumerable 뭔가에 값을 설정합니다.

    당신은 SQL Server 2008 이상을 사용하는 경우, 당신은 테이블 반환 매개 변수를 사용할 수있다 - 이것은 당신이 매개 변수로 값의 테이블에 전달할 수 있습니다. .NET에서 당신은 "구조화"형 SqlParameter에 정의 및 구현을 IEnumerable 뭔가에 값을 설정합니다.

    여기에 예제와 함께 전체 MSDN 참조를 참조하십시오 : http://msdn.microsoft.com/en-us/library/bb675163.aspx

  5. ==============================

    5.사용 XML,이 시나리오 빨리의 많은. 당신은 XML로 목록을 설정하고 단순히 문자열을 전달합니다 :

    사용 XML,이 시나리오 빨리의 많은. 당신은 XML로 목록을 설정하고 단순히 문자열을 전달합니다 :

    CREATE TABLE #myTempTable
    (   Letter VARCHAR(20) )
    
    INSERT INTO  #myTempTable (Letter) VALUES ('A'), ('B')
    
    Declare @xml XML = '<a>A</a><a>B</a><a>C</a>'
    
    Select * from #myTempTable 
    Where Letter in 
    (Select p.value('.', 'VARCHAR(40)') AS [Letter] from @xml.nodes('//a') as t(p)) 
    
    DROP TABLE #myTempTable
    
  6. ==============================

    6.나는 쉼표 문자열을 분리로 일반적으로 목록을 전달하고 난 다음 다른 쿼리와 결합하는 데 사용할 수있는 테이블에 '분할'문자열 테이블 반환 함수를 사용합니다.

    나는 쉼표 문자열을 분리로 일반적으로 목록을 전달하고 난 다음 다른 쿼리와 결합하는 데 사용할 수있는 테이블에 '분할'문자열 테이블 반환 함수를 사용합니다.

    DECLARE @Settings TABLE (Sid INT)   
    INSERT INTO @Settings(Sid)
    SELECT CAST(Items AS INT) FROM dbo.Split(@SettingsParameter, ',')
    

    물론 당신은 SQL Server 2008을 사용하지 않는 경우, 그때 테이블을 반환 매개 변수를 사용합니다.

  7. from https://stackoverflow.com/questions/4502821/how-do-i-translate-a-liststring-into-a-sqlparameter-for-a-sql-in-statement by cc-by-sa and MIT license