我正在开发一个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 :(得分:8)
Dictionary
将一种类型的对象映射到另一种类型的对象。在你的情况下,你有一个Dictionary<string, string>
。所以,如果你有这样的初始化:
Dictionary<string, string> dic = new Dictionary<string, string>()
{
{ "key1", "value1" },
{ "key2", "value2" },
{ "key3", "value3" }
};
您可以通过
获取key2
的值
dic["key2"]; // gives "value2"
Dictionary
是强类型的,所以不需要任何强制转换。正如Jon Skeet所说,你可能会在这里找到List<string>
。您可以通过整数索引访问它们。
答案 1 :(得分:6)
您似乎试图通过整数索引访问Dictionary<string, string>
。你不能这样做 - 你必须通过键查找值,这是一个字符串。
如果您不想使用字符串键,为什么要使用Dictionary<string, string>
开头?您可以使用List<string>
还是Dictionary<int, string>
?
请注意,一旦 设法适当地使用索引器,您就不需要转换为字符串。
答案 2 :(得分:3)
这是一段能够完成你所追求的代码,我认为......你必须添加一个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;
}
}
答案 3 :(得分: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
,因为字典对象已经返回字符串。
答案 4 :(得分:1)
我无法理解你在寻找什么,所以这是我的小建议。 有一种方法可以通过不按键请求项目来浏览字典。这是一个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
}
答案 5 :(得分:0)
必须通过密钥访问是的值。