标签: datareader

如何轻松将DataReader转换为List <T>?

我有一个数据DataReader,我希望将其转换为List<T>.对此有什么简单的解决方案?

例如,在CustomerEntity类中,我有CustomerId和CustomerName属性.如果我的DataReader将这两列作为数据返回,那么我该如何将其转换为List<CustomerEntity>.

c# datareader generic-list

112
推荐指数
8
解决办法
26万
查看次数

DataReader中的Multiples表

我通常使用,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,这可能吗?

.net c# asp.net datareader sqldatareader

47
推荐指数
2
解决办法
6万
查看次数

在C#中处理DBNull

有没有更好/更清洁的方法来做到这一点?

int stockvalue = 0;
if (!Convert.IsDBNull(reader["StockValue"]))
    stockvalue = (int)reader["StockValue"];
Run Code Online (Sandbox Code Playgroud)

c# dbnull datareader

38
推荐指数
6
解决办法
4万
查看次数

将数据读取器中的行转换为键入的结果

我正在使用第三方库来返回数据阅读器.我想要一个简单的方法,并尽可能通用将其转换为对象列表.
例如,假设我有一个具有2个属性EmployeeId和Name的类'Employee',我希望将数据读取器(包含员工列表)转换为List <Employee>.
我想我别无选择,只能迭代数据阅读器的各行,并为每一行将它们转换为我将添加到List的Employee对象.更好的解决方案?我正在使用C#3.5,理想情况下我希望它尽可能通用,以便它适用于任何类(DataReader中的字段名称与各种对象的属性名称匹配).

c# datareader list

27
推荐指数
2
解决办法
4万
查看次数

使用DataReader读取日期

我用数据读取器读取了这种格式的字符串.如何使用类似格式阅读日期?

while (MyReader.Read())
{
    TextBox1.Text = (string)MyReader["Note"];
}
Run Code Online (Sandbox Code Playgroud)

.net c# ado.net datareader

26
推荐指数
4
解决办法
9万
查看次数

如何从DataReader的当前行中获取DataRow?

好的,我想提取DataRow一个DataReader.我一直在寻找相当长的一段时间,看起来没有一种简单的方法可以做到这一点.

我理解a DataReader更多是行的集合,但它当时只读取一行.

所以我的问题是:有没有办法提取DataRow出当前的一行DataReader

c# datareader datarow

21
推荐指数
1
解决办法
4万
查看次数

.NET DataTable跳过Load(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语句会导致它为每行创建唯一标识符.
这只是一个理论,我没有什么可以支持它,但我所有的测试似乎都会导致相同的结果.

.net datatable datareader localreport

20
推荐指数
4
解决办法
9698
查看次数

20
推荐指数
2
解决办法
2万
查看次数

如何用多个表填充数据集?

我正在尝试填充包含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.

c# sql ado.net datareader dataset

19
推荐指数
3
解决办法
10万
查看次数

我想知道在迭代数据读取器对象时,'yield'的连接状态和对代码性能的影响

这是我用来从数据库中获取数据的示例代码:在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)

上面的代码运行良好,但我想知道上述代码的两个问题.

  1. 数据阅读器的连接将打开多长时间?
  2. 当我只考虑代码性能因素时,使用'yield return'而不​​是将记录添加到列表并返回整个列表是一个好主意吗?

c# linq using datareader yield-return

16
推荐指数
1
解决办法
2万
查看次数