我有一个数据DataReader,我希望将其转换为List<T>.对此有什么简单的解决方案?
例如,在CustomerEntity类中,我有CustomerId和CustomerName属性.如果我的DataReader将这两列作为数据返回,那么我该如何将其转换为List<CustomerEntity>.
我通常使用,DataSet因为它非常灵活.最近我被分配了代码优化任务,为了减少对数据库的命中,我在一个程序中更改了两个查询.一个Query返回count,另一个返回actual data.也就是说,My stored procedure返回两个表.现在,我知道如何使用读取两个表DataSets,但我需要使用读取两个表DataReader.寻找我发现了这个.
我按照文章编写了这样的代码:
dr = cmd.ExecuteReader();
while (dr.Read())
{
}
if (dr.NextResult()) // this line throws exception
{
while (dr.Read())
{
Run Code Online (Sandbox Code Playgroud)
但是我在dt.NextResult上得到了一个例外.例外情况是:
Invalid attempt to call NextResult when reader is closed.
Run Code Online (Sandbox Code Playgroud)
我也试图谷歌上面的错误,但仍然无法解决问题.任何帮助都感激不尽.我需要使用多个表读取datareader,这可能吗?
有没有更好/更清洁的方法来做到这一点?
int stockvalue = 0;
if (!Convert.IsDBNull(reader["StockValue"]))
stockvalue = (int)reader["StockValue"];
Run Code Online (Sandbox Code Playgroud) 我正在使用第三方库来返回数据阅读器.我想要一个简单的方法,并尽可能通用将其转换为对象列表.
例如,假设我有一个具有2个属性EmployeeId和Name的类'Employee',我希望将数据读取器(包含员工列表)转换为List <Employee>.
我想我别无选择,只能迭代数据阅读器的各行,并为每一行将它们转换为我将添加到List的Employee对象.更好的解决方案?我正在使用C#3.5,理想情况下我希望它尽可能通用,以便它适用于任何类(DataReader中的字段名称与各种对象的属性名称匹配).
我用数据读取器读取了这种格式的字符串.如何使用类似格式阅读日期?
while (MyReader.Read())
{
TextBox1.Text = (string)MyReader["Note"];
}
Run Code Online (Sandbox Code Playgroud) 好的,我想提取DataRow一个DataReader.我一直在寻找相当长的一段时间,看起来没有一种简单的方法可以做到这一点.
我理解a DataReader更多是行的集合,但它当时只读取一行.
所以我的问题是:有没有办法提取DataRow出当前的一行DataReader?
我正在尝试使用以下内容填充DataTable,以构建LocalReport:
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = new MySqlConnection(Properties.Settings.Default.dbConnectionString);
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ... LEFT JOIN ... WHERE ..."; /* query snipped */
// prepare data
dataTable.Clear();
cn.Open();
// fill datatable
dt.Load(cmd.ExecuteReader());
// fill report
rds = new ReportDataSource("InvoicesDataSet_InvoiceTable",dt);
reportViewerLocal.LocalReport.DataSources.Clear();
reportViewerLocal.LocalReport.DataSources.Add(rds);
Run Code Online (Sandbox Code Playgroud)
有一次,我注意到报告不完整,缺少一条记录.我已经改变了一些条件,以便查询将返回两行并且... 惊讶:报告只显示一行而不是两行.我试图调试它以找出问题所在,我陷入了困境
dt.Load(cmd.ExecuteReader());
Run Code Online (Sandbox Code Playgroud)
当我注意到它DataReader包含两个记录但DataTable只包含一个.不小心,我ORDER BY在查询中添加了一个子句,并注意到这次报告正确显示.
显然,DataReader包含两行,但是如果SQL查询字符串包含一行,则DataTable只读取它们ORDER BY(否则它只读取最后一行).任何人都可以解释为什么会发生这种情况以及如何解决这个问题?
编辑:
当我第一次发布问题时,我说它正在跳过第一行; 后来我意识到它实际上只读了最后一行并且我相应地编辑了文本(当时所有的记录都被分成两行,当它实际上只显示最后一行时它似乎跳过了第一行).这可能是因为它没有唯一的标识符来区分MySQL返回的行,因此添加ORDER BY语句会导致它为每行创建唯一标识符.
这只是一个理论,我没有什么可以支持它,但我所有的测试似乎都会导致相同的结果.
我正在尝试填充包含2个具有一对多关系的表的DataSet.我正在使用DataReader来实现这个目的:
public DataSet SelectOne(int id)
{
DataSet result = new DataSet();
using (DbCommand command = Connection.CreateCommand())
{
command.CommandText = "select * from table1";
var param = ParametersBuilder.CreateByKey(command, "ID", id, null);
command.Parameters.Add(param);
Connection.Open();
using (DbDataReader reader = command.ExecuteReader())
{
result.MainTable.Load(reader);
}
Connection.Close();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
但我只填了一张桌子.我如何实现目标 - 填写两个表格?
如果可能的话,我想使用DataReader而不是DataAdapter.
这是我用来从数据库中获取数据的示例代码:在DAO层:
public IEnumerable<IDataRecord> GetDATA(ICommonSearchCriteriaDto commonSearchCriteriaDto)
{
using(DbContext)
{
DbDataReader reader = DbContext.GetReader("ABC_PACKAGE.GET_DATA", oracleParams.ToArray(), CommandType.StoredProcedure);
while (reader.Read())
{
yield return reader;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在BO层我调用上面的方法,如:
List<IGridDataDto> GridDataDtos = MapMultiple(_costDriversGraphDao.GetGraphData(commonSearchCriteriaDto)).ToList();
Run Code Online (Sandbox Code Playgroud)
在mapper层上MapMultiple方法的定义如下:
public IGridDataDto MapSingle(IDataRecord dataRecord)
{
return new GridDataDto
{
Code = Convert.ToString(dataRecord["Code"]),
Name = Convert.ToString(dataRecord["Name"]),
Type = Convert.ToString(dataRecord["Type"])
};
}
public IEnumerable<IGridDataDto> MapMultiple(IEnumerable<IDataRecord> dataRecords)
{
return dataRecords.Select(MapSingle);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行良好,但我想知道上述代码的两个问题.
datareader ×10
c# ×9
.net ×3
ado.net ×3
asp.net ×1
datarow ×1
dataset ×1
datatable ×1
dbnull ×1
generic-list ×1
linq ×1
list ×1
localreport ×1
sql ×1
using ×1
yield-return ×1