2014-11-08 5 views
0

У меня есть список BuilderString, который я хочу, чтобы содержать данныеЧтение данных из базы данных SQL Server с C#

public List<int> IDS = new List<int>(); 

public List<StringBuilder> Items = new List<StringBuilder>(); 

Что случилось с этим кодом?

SqlConnection con2 = new SqlConnection("Data Source=aya-PC\\SQLEXPRESS;Initial Catalog=ItemSet;Integrated Security=True"); 
SqlDataReader rdr2; 
SqlCommand cmd2; 

con2.Open(); 

for (int i = 0; i < IDS.Count; i++) 
{ 
    cmd2 = new SqlCommand("select item From TransactiontData where [email protected][i]", con2); 
    cmd2.CommandType = CommandType.Text; 
    rdr2 = cmd2.ExecuteReader(); 
    SqlParameter param = new SqlParameter(); 
    param.ParameterName = "@IDS[i]" 

    while (rdr2.Read()) 
    { 
     Items[i].Append((StringBuilder)rdr2["item"]); 
    } 
} 

ответ

1

Вы должны изменить ваш код немного:

using (SqlConnection con2 = new SqlConnection("Data Source=aya-PC\\SQLEXPRESS;Initial Catalog=ItemSet;Integrated Security=True")) 
using (SqlCommand cmd2 = new SqlCommand("select item From TransactiontData where idT = @IDS", con2)) 
{ 
    // add the paramter to the command 
    cmd2.Parameter.Add("@IDS", SqlDbType.Int); 

    con2.Open(); 

    for (int i = 0; i < IDS.Count; i++) 
    { 
     // set the parameter value 
     cmd2.Parameter["@IDS"].Value = IDS[i]; 

     // only *THEN* call ExecuteReader() 
     using (SqlDataReader rdr2 = cmd2.ExecuteReader()) 
     { 
       while (rdr2.Read()) 
       { 
        // **NOT SURE** what you're trying to do here..... 
        // First of all, you need to just call Items.Add() 
        // to add new items to the list - and I'm TOTALLY 
        // UNCLEAR what you're trying to do casting the reader 
        // value to a StringBuilder....... 
        // 
        // Items[i].Append((StringBuilder)rdr2["item"]); 
        // 
        // replaced with what *might* make more sense..... 
        Items.Add(rdr2["item"].ToString()); 
       } 

       rdr.Close(); 
     } 
    }   

    con2.Close(); 
} 

Очки отметить:

  • Я бы рекомендовал всегда поставить SqlConnection, SqlCommand и SqlDataReader в using() {...} блоки для обеспечения надлежащей утилизации

  • Вам необходимо добавить свой параметр и установить его значениеПЕРЕД НАЙТИ Вы звоните .ExecuteReader()!

  • Поскольку сам запрос никогда не изменяется - нет смысла создавать новый SqlCommand на каждой итерации. Создать команду раз - а затем просто установить значение параметра (что единственное изменение) один раз в итерации

+0

есть ошибка диапазона списка «Индекс находился вне диапазона. Должно быть неотрицательным и меньше, чем размер коллекции.» –

+0

Комбинация/слияния этого ответа, а другой от @ DanGuzman- SQLServerMVP будет лучше/работать. Для этого ответа: 1) установка 'cmd2.Parameter [" @ IDS "]. Значение' должно быть 'IDS [i]', 2), скорее всего, не понадобится некоторое время вокруг 'rdr2.Read()', 3) коллекция 'Items' еще не имеет элементов, поэтому вам нужно использовать' Items.Add() 'вместо ссылки через' Items [i] ', 4). Я не думаю, что вы можете (или должны) приведение непосредственно к StringBuilder, поскольку входящее значение на самом деле является просто строкой, а 5) должно, вероятно, иметь 'con2.Close()' после цикла 'for'. –

+0

@srutzky: ** (1) **: нет, проверьте мой ответ - имя параметра в моем ответе ** IS ** просто '@ IDS' - нет смысла индексировать это имя параметра .... и ** (5) ** - необязательно, так как блоки 'using() {...}' ** гарантируют ** надлежащее удаление (и, таким образом, закрытие) connectoin –

0

Вам необходимо присвоить значение параметра в коде приложения, а не в запросе , Я не уверен, что вы пытаетесь выполнить, выставив значение столбца как StringBuilder. Предполагая, что каждый элемент StringBuilder должен содержать одну строку, полученную из столбца varchar/nvarchar, пример ниже сделает это.

for (int i = 0; i < IDS.Count; i++) 
{ 
     var cmd2 = new SqlCommand("select item From TransactiontData where [email protected]", con2); 

     SqlParameter param = new SqlParameter("@IDS", SqlDbType.Int) { Value = IDS[i] }; 

     var rdr2 = cmd2.ExecuteReader(); 

     while (rdr2.Read()) 
     { 
      Items.Add(new StringBuilder((string)rdr2["item"])); 
     } 
} 
+0

есть проблема с индексом списка «Индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции." –

+0

Эта ошибка подразумевает, что ваш код не инициализировал List . Я изменил код, чтобы добавить элемент в коллекцию. –

+0

Комбинация/слияние этого ответа, а другая из @marc_s будет лучше/работать. ответ: 1) вы должны переместить строку 'var cmd2' над циклом, поскольку она не изменяется, 2) вы должны переместить' SqlParameter param = new SqlParameter ("@ IDS", SqlDbType.Int) 'вне цикла, 3) установить 'param' внутри цикла, 4), скорее всего, не нужно' while' вокруг 'rdr2.Read()' и 5), вам нужно закрыть читателя, так как вы не можете выпустить другой 'ExecuteReader', пока текущий не будет закрыт (справа?). –

Смежные вопросы