Как я получаю доступ к объектам Словаря?

Я разрабатываю 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", и т.д., таким образом, не самое удобное для пользователя. Какие-либо другие подсказки?Спасибо!

10
задан jessehouwing 29 December 2016 в 19:31
поделиться

6 ответов

Вы, похоже, пытаетесь получить доступ к Словарь<струнная строка, строка> по индексу integer. Вы не можете этого сделать - вы должны найти значение по ключу, который является строкой.

Если вы не хотите использовать строковые клавиши, почему вы используете Словарь<струсть, строка> для начала? Не могли бы вы использовать List или Dictionary?

Обратите внимание, что как только вам удалось правильно использовать индексатор, вам не нужно будет привести к строке.

6
ответ дан 3 December 2019 в 16:51
поделиться

Если ваши ключи - «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;

Кроме того, нет необходимости приводить к строке , поскольку объект словаря уже будет возвращать строки.

1
ответ дан 3 December 2019 в 16:51
поделиться

Словарь отображает объекты одного типа в объекты другого типа. В вашем случае у вас есть Dictionary . Итак, если бы он был инициализирован следующим образом:

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

Вы бы получили значение для key2 , выполнив

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

Словарь строго типизирован, поэтому нет необходимости Кастинг. Как говорит Джон Скит, вам может быть лучше с List здесь. Вы можете получить к ним доступ по целочисленному индексу.

13
ответ дан 3 December 2019 в 16:51
поделиться

Вот кусок кода, который сделает то, что вы хотите, я думаю... Вам придется добавить оператор 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
ответ дан 3 December 2019 в 16:51
поделиться

Я не могу понять, что именно вы ищете, поэтому вот мой небольшой совет. Есть способ просматривать словарь, не запрашивая элементы по ключу. Это опция 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
ответ дан 3 December 2019 в 16:51
поделиться

Да значения должны быть доступны по ключу.

0
ответ дан 3 December 2019 в 16:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: