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