C# }

C# },c#,collections,sqldatareader,C#,Collections,Sqldatareader,有一个更好的方法(你只需要做一次,将来会有帮助)。从DbDataReader派生一个类,该类将在构造函数中接受sqldatareader: public class CustomReader : DbDataReader { private readonly SqlDataReader sqlDataReader; //Set the sqlDataReader public CustomReader(SqlDataReader sqlDataReader) {

有一个更好的方法(你只需要做一次,将来会有帮助)。从DbDataReader派生一个类,该类将在构造函数中接受sqldatareader:

 public class CustomReader : DbDataReader
{
    private readonly SqlDataReader sqlDataReader;
    //Set the sqlDataReader
    public CustomReader(SqlDataReader sqlDataReader)
    {
        this.sqlDataReader = sqlDataReader;
        //Cache the names
        this.CacheColumns();
    }
    private Dictionary<string,int> nameOrdinals = new Dictionary<string, int>(); 
    private void CacheColumns()
    {
        int fieldCount= this.sqlDataReader.FieldCount;
        for (int i = 0; i <= fieldCount-1; i++)
        {
            string name=sqlDataReader.GetName(i);
            nameOrdinals.Add(name,i);
        }
    }

    public override object this[string name]
    {
        get
        {
            int ordinal=this.nameOrdinals[name];
            return this.GetValue(ordinal);
        }
    }
    //Custom implementation
    public string GetString(string name)
    {
        int ordinal = this.nameOrdinals[name];
        return this.GetString(ordinal);
    }
    //Custom implementation
    public string GetString(string name,string defaultValue)
    {
        int ordinal = this.nameOrdinals[name];
        if (this.IsDBNull(ordinal))
        {
            return defaultValue;
        }

        return this.GetString(ordinal);
    }

    //return from sqlDataReader
    public override string GetString(int ordinal)
    {
        return sqlDataReader.GetString(ordinal);
    }


    public override void Close()
    {
        sqlDataReader.Close();
    }
公共类CustomReader:DbDataReader
{
专用只读SqlDataReader SqlDataReader;
//设置sqlDataReader
公共CustomReader(SqlDataReader SqlDataReader)
{
this.sqlDataReader=sqlDataReader;
//缓存名称
this.CacheColumns();
}
专用词典名称序号=新词典();
私有void缓存列()
{
int fieldCount=this.sqlDataReader.fieldCount;

对于(inti=0;i嗯,我第一篇文章中的代码还可以!错误在我的POCO定义中

这就是问题的原因:

...

private DateTime _dt_get;    

public DateTime dt_get
{
    get { return _dt_get; }
    set { value = _dt_get; }  // <-- !!! insted of set { _dt_get = value; }
}


...
。。。
私人日期时间;
公共日期时间
{
get{return\u dt\u get;}

set{value=\u dt\u get;}/使用SqlDataReader和DataTable有几种方法可以做到这一点

        IEnumerable<DataRow> list0 = dt.AsEnumerable();
IEnumerable list0=dt.AsEnumerable();

List list1=新列表(dt.Select());

List list2=dt.AsEnumerable().ToList();
有关DataTable的简单示例,请看一下


这是一种更好的方法,thx…将在某个更大的项目中尝试!您能告诉我哪里做错了吗?我只使用默认值获取所有行。正如我所说,db table没有可空字段(大约70000行),所以它与DBNull无关…??您不需要执行reader.hasrows,reader.read()是一个布尔值,这可能是导致它的原因。因此请从上面删除hasrows并重试。认为它甚至可能没有从读取器读取任何数据。不确定它是否更快,但可以尝试在一个构造函数中传递值。您知道您可以使用自动实现的属性,对吗?例如
public DateTime dt_get{get;set;}
...

private DateTime _dt_get;    

public DateTime dt_get
{
    get { return _dt_get; }
    set { value = _dt_get; }  // <-- !!! insted of set { _dt_get = value; }
}


...
        IEnumerable<DataRow> list0 = dt.AsEnumerable();
        List<DataRow> list1 = new List<DataRow>(dt.Select());
        List<DataRow> list2 = dt.AsEnumerable().ToList();