Я разрабатываю 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;
}
но это дает мне ошибку компилятора:
The best overloaded method match for 'System.Collections.Generic.Dictionary<string,string>.this[string]' has some invalid arguments
Я просто хочу получить доступ к каждому значению от "dic" и загрузки в эти параметры SQL. Как я делаю это? Я должен ввести ключ? Ключи называют "col1", "col2", и т.д., таким образом, не самое удобное для пользователя. Какие-либо другие подсказки?Спасибо!
Вы, похоже, пытаетесь получить доступ к Словарь<струнная строка, строка>
по индексу integer. Вы не можете этого сделать - вы должны найти значение по ключу, который является строкой.
Если вы не хотите использовать строковые клавиши, почему вы используете Словарь<струсть, строка>
для начала? Не могли бы вы использовать List
или Dictionary
?
Обратите внимание, что как только вам удалось правильно использовать индексатор, вам не нужно будет привести к строке.
Если ваши ключи - «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;
Кроме того, нет необходимости приводить к строке
, поскольку объект словаря уже будет возвращать строки.
Словарь
отображает объекты одного типа в объекты другого типа. В вашем случае у вас есть Dictionary
. Итак, если бы он был инициализирован следующим образом:
Dictionary<string, string> dic = new Dictionary<string, string>()
{
{ "key1", "value1" },
{ "key2", "value2" },
{ "key3", "value3" }
};
Вы бы получили значение для key2
, выполнив
dic["key2"]; // gives "value2"
Словарь
строго типизирован, поэтому нет необходимости Кастинг. Как говорит Джон Скит, вам может быть лучше с List
здесь. Вы можете получить к ним доступ по целочисленному индексу.
Вот кусок кода, который сделает то, что вы хотите, я думаю... Вам придется добавить оператор 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;
}
}
Я не могу понять, что именно вы ищете, поэтому вот мой небольшой совет. Есть способ просматривать словарь, не запрашивая элементы по ключу. Это опция 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
}