1

我想从数据库中读取数据到列表中。

我尝试了以下代码

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 值为 Enumeration 未产生任何结果。

4

2 回答 2

5

我的猜测是在执行循环期间发生了一些错误。这种技术...

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

...确保忽略此错误,您得到的只是一个不完整的结果。正如您所注意到的,这使得调试非常困难。所以不要那样做。

因此,解决方案是:

  • 删除 try-catch 块(即,替换try { ... } catch(Exception ex) {}...),
  • 再次运行代码,
  • 注意发生的错误,
  • 如果你理解错误
    • 修理它
  • 别的
    • 在 StackOverflow 上再次提问,在一个新问题中。

而且,永远,永远不要再写catch (Exception ex) {}。;-)进行正确的错误处理,或者根本不进行错误处理。

于 2011-11-24T11:44:20.053 回答
2

读者不会丢行;阅读器经过了很好的测试。吞咽异常不会有帮助。如果我不得不猜测,这里的问题是您item一遍又一遍地添加相同的内容。实际上,您添加了 N+1 次(即使没有返回任何行,您也将其添加到顶部一次)。

但是,我可以建议:只需使用类似dapper之类的东西,它可以完成上述所有操作,除了 a:它正确,b:它是高度优化的(它发出自定义 IL 以避免持续反射,并缓存该 IL)。这将类似于:

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

在哪里namedArgs,传入@idand @name,例如:

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

IE

int id = ...
string name = ...
var list = connection.Query<T>("MyProc", new {id, name},
       commandType: CommandType.StoredProcedure).ToList();
于 2011-11-24T11:45:15.197 回答