Не удалось прочитать значения с помощью IDataReader - PullRequest
1 голос
/ 24 ноября 2011

Я хочу прочитать данные в список из базы данных.

Я попробовал следующий код

public List<T> StoredProcedureForIList<T>(string spName, params IDataParameter[] commandParameters)
{
   List<T> list = new List<T>();

   T item;
   Type listItemType = typeof(T);
   item = (T)Activator.CreateInstance(listItemType);
   list.Add(item);

   using (IDatabaseConnection connection = new DatabaseConnection())
   {
       IDbCommand cmd = connection.CreateCommandForStoredProcedure(spName);
       foreach (SqlParameter par in commandParameters)
       {
          cmd.Parameters.Add(par);
       }

       try
       {
          using (IDataReader reader = cmd.ExecuteReader())
          {
             while (reader != null && reader.Read())
             {
                for (int i = 0; i < reader.FieldCount; i++)
                {
                   var prop = listItemType.GetProperty(reader.GetName(i));
                   prop.SetValue(item, reader[i], null);
                }
                list.Add(item);
             }
          }
       }
       catch(Exception ex)
       { }

       return list;
   }
} 

Но проблема в том, что при запуске цикла for считыватель теряет данные.

Значение ResultView для считывателя данных: перечисление не дало результатов.

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Я предполагаю, что во время выполнения вашего цикла возникает какая-то ошибка.Этот метод ...

try 
{ 
    ...
} 
catch(Exception ex) 
{ } 

... гарантирует, что эта ошибка игнорируется, и все, что вы получаете, является неполным результатом.Как вы заметили, это затрудняет отладку.Так что не делайте этого.

Таким образом, решение таково:

  • удалить блок try-catch (т. Е. Заменить try { ... } catch(Exception ex) {} на ...),
  • запустите код еще раз,
  • обратите внимание на возникшую ошибку,
  • если вы понимаете ошибку
    • исправьте ее
  • else
    • снова спросить в StackOverflow, в новом вопросе.

И, никогда, никогда не писать catch (Exception ex) {} снова.;-) Выполните правильную обработку ошибок или не выполняйте обработку ошибок вообще.

2 голосов
/ 24 ноября 2011

Читатель не будет сбрасывать строки; Читатель довольно хорошо проверен. Глотание исключений не поможет. Если бы мне пришлось угадывать, проблема в том, что вы добавляете один и тот же item снова и снова. Фактически, вы добавляете его N + 1 раз (вы добавляете его один раз вверху, даже если строки не возвращаются).

Тем не менее, могу ли я предложить: просто используйте что-то вроде dapper , который делает все выше, кроме a: он делает это правильно и b: он высоко оптимизирован (он испускает собственный IL, чтобы избежать постоянного отражения и кеширует что ил). Это было бы что-то вроде:

var list = connection.Query<T>(procName, namedArgs,
       commandType: CommandType.StoredProcedure).ToList();

, где будет namedArgs, для передачи @id и @name, например:

new {id=123, name="abc"}

т.е.

int id = ...
string name = ...
var list = connection.Query<T>("MyProc", new {id, name},
       commandType: CommandType.StoredProcedure).ToList();
...