2010-06-07 10 views
7

C# VS2008/SQL Server 웹 사이트 앱을 개발 중이며 사전 클래스에 익숙하지 않습니다. 이 작업을 수행하는 가장 좋은 방법에 대해 조언 해 주실 수 있습니까? 여기에 코드입니다 :사전 항목은 어떻게 만듭니 까?

SqlConnection conn2 = new SqlConnection(connString); 
SqlCommand cmd = conn2.CreateCommand(); 
cmd.CommandText = "dbo.AppendDataCT"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = conn2; 
SqlParameter p1, p2, p3; 
foreach (string s in dt.Rows[1].ItemArray) 
{ 
    DataRow dr = dt.Rows[1]; // second row 
    p1 = cmd.Parameters.AddWithValue((string)dic[0], (string)dr[0]); 
    p1.SqlDbType = SqlDbType.VarChar; 
    p2 = cmd.Parameters.AddWithValue((string)dic[1], (string)dr[1]); 
    p2.SqlDbType = SqlDbType.VarChar; 
    p3 = cmd.Parameters.AddWithValue((string)dic[2], (string)dr[2]); 
    p3.SqlDbType = SqlDbType.VarChar; 
} 

그러나 이것은 나에게 컴파일러 오류를주고있다 : 난 그냥이 SQL 매개 변수로 "DIC"에서 각 값에 액세스하고로드 할

The best overloaded method match for 'System.Collections.Generic.Dictionary<string,string>.this[string]' has some invalid arguments 

. 어떻게해야합니까? 열쇠를 입력해야합니까? 키의 이름은 "col1", "col2"등으로 사용자 친화적이지는 않습니다. 다른 팁? 감사!

+0

이것은 중복입니다. 두 번 물었습니다. –

+0

[다른 변수에 사전 변수를 전달하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/2987142/how-to-pass-a-dictionary-variable-to-another-procedure) –

답변

5

Dictionary<string, string>정수 색인으로 액세스하려는 것 같습니다. 당신은 그것을 할 수 없습니다 - 당신은 문자열 인 키에 의해 값을 찾아야 만합니다.

문자열 키를 사용하지 않으려면 Dictionary<string, string>을 사용하는 이유는 무엇입니까? List<string> 또는 Dictionary<int, string>을 사용할 수 있습니까?

이 적절하게 관리되면 인덱서를 사용할 수 있으므로 문자열로 전송할 필요가 없습니다.

0

예 값은 키로 액세스해야합니다.

6

Dictionary은 하나의 유형의 객체를 다른 유형의 객체로 매핑합니다. 귀하의 경우에는 Dictionary<string, string>입니다. 당신이 있던 경우에 따라서는 다음과 같이 초기화 :

Dictionary<string, string> dic = new Dictionary<string, string>() 
{ 
    { "key1", "value1" }, 
    { "key2", "value2" }, 
    { "key3", "value3" } 
}; 

당신은

dic["key2"]; // gives "value2" 

Dictionary는 강력한 형식입니다을 수행하여 key2의 값을 얻을 것, 그래서 어떤 캐스팅에 대한 필요가 없습니다. Jon Skeet이 말했듯이 여기 List<string>으로 더 나을 수도 있습니다. 정수 인덱스를 사용하여 액세스 할 수 있습니다.

1

키가 "col1", "col2"등인 경우 0, 1 등을 사용하면 오류가 발생합니다. 이 시도 :

p1 = cmd.Parameters.AddWithValue(dic["col1"], dr[0]); 
p1.SqlDbType = SqlDbType.VarChar; 
p2 = cmd.Parameters.AddWithValue(dic["col2"], dr[1]); 
p2.SqlDbType = SqlDbType.VarChar; 
p3 = cmd.Parameters.AddWithValue(dic["col3"], dr[2]); 
p3.SqlDbType = SqlDbType.VarChar; 

은 또한, 이미 문자열을 반환합니다 사전 개체로 string으로 캐스팅 할 필요가 없습니다.

0

정말 당신이 무엇을 찾고 있는지 이해할 수 없으므로 여기에 제 조언이 있습니다. 키로 항목을 요청하지 않고 사전을 찾아 볼 수있는 방법이 있습니다. foreach 옵션입니다.

foreach (KeyValuePair<string,string> pair in dic) 
{ 
    p. = cmd.Parameters.AddWithValue(dic.Value /*or dic.Key*/, (string)dr[0]); 
    p.SqlDbType = SqlDbType.VarChar; 
    // further processing of this parameter 
} 
1

은 여기 계신 할 것입니다 코드의 조각이다, 나는 ... 당신은 다른 문에 추가해야합니다 생각하지만, 그것은 가야 당신은 시작했다.

public void AttachParam(ref DbCommand command, Dictionary<string, string> parameters) 
{ 
    try 
    { 
    if (parameters.Count > 0) 
    { 
     foreach (KeyValuePair<string, string> kvp in parameters) 
     { 
      command.Parameters.AddWithValue(kvp.Key, kvp.Value); 
     } 
    } 
    } 
    catch (Exception ex) 
    { 
    throw; 
    } 
} 
관련 문제