2010-06-07 82 views
7

我正在开发一个C#VS2008/SQL Server网站应用程序,并且是Dictionary类的新手。你能否建议完成这个最好的方法?下面的代码片段:如何访问词典项目?

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; 
} 

但是这是给我的编译器错误:

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

我只是想从“DIC”访问每个值,并加载到这些SQL参数。我该怎么做呢?我必须输入密钥吗?这些键被命名为“col1”,“col2”等,因此不是最方便用户的。任何其他提示?谢谢!

+0

这是一个重复的,你问了两次。 – 2010-06-07 13:01:14

+0

[如何将字典变量传递给另一个过程]的可能重复(http://stackoverflow.com/questions/2987142/how-to-pass-a-dictionary-variable-to-another-procedure) – 2010-06-07 13:01:31

回答

5

您似乎试图访问Dictionary<string, string>整数索引。你不能这么做 - 你必须用键来查找值,这是一个字符串。

如果你不想使用字符串键,为什么你用Dictionary<string, string>开始?你可以使用List<string>还是Dictionary<int, string>

请注意,一旦您设法适当地使用索引器,您将不需要转换为字符串。

0

是的值必须由密钥访问。

6

A 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

下面是一段代码,将你以后在做什么,我想..你将不得不在一个else语句添加,但它应该让你开始。

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; 
    } 
}