日期:2014-05-19  浏览次数:20665 次

能否从一个没有读到数据SqlDataReader中创建DataTable
我要经常通过SQL语句得到一个表,然后读入到DataTable中,过去的做法是通过DataAdapter.Fill(dataset,   p_MapName);实现,然后取出dataset.Tables[0]就可以了,经过比较,发现还是SqlDataReader速度快,因此,我改为通过SqlDataReader读取数据,并根据SqlDataReader.Read()一行后,手工创建DataTable,效率较高,但有个问题,如果一行数据都没有读到,则DataTable无法创建,因为不知道有就列,也不知道列的类型,而通过DataAdapter.Fill可以得到一张空的DataTable

------解决方案--------------------
DS = Sqldb.SqlSelectDataSet(strSql)
For i = 1 To DS.Tables(0).Rows.Count - 1
DT.Rows.Add(DT.NewRow)
DT.Rows(j).Item( "INVSEC ") = DS.Tables(0).Rows(i).Item( "INVSEC ")
DT.Rows(j).Item( "INVSYC ") = DS.Tables(0).Rows(i).Item( "INVSYC ")
DT.Rows(j).Item( "INVAMT ") = DS.Tables(0).Rows(i).Item( "INVAMT ")
まだ
DT.Columns.Add( "INVSEC ")
DT.Columns.Add( "INVSYC ")
DT.Columns.Add( "INVAMT ")
DT.Columns.Add( "INVAMT_TAX ")
DT.Columns.Add( "INVTAX ")
DT.Columns.Add( "TOTAL ")
DT.Rows.Clear()
Next
Me.DataSource = DS.Tables(0)

空白的没试过
------解决方案--------------------
你这样做的效率还没有直接读到datatable中快
------解决方案--------------------
IList <实体对象>
感觉扩展性更好!
------解决方案--------------------
也是Read()数据插入IList <实体对象>
------解决方案--------------------
没必要这样做..

/// <summary>
/// 将DataReader转为DataTable
/// </summary>
/// <param name= "DataReader "> DataReader </param>
public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
{
///定义DataTable
DataTable datatable = new DataTable();

try
{ ///动态添加表的数据列
for(int i = 0; i < dataReader.FieldCount; i++)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = dataReader.GetFieldType(i);
myDataColumn.ColumnName = dataReader.GetName(i);
datatable.Columns.Add(myDataColumn);
}

///添加表的数据
while(dataReader.Read())
{
DataRow myDataRow = datatable.NewRow();
for(int i = 0; i < dataReader.FieldCount; i++)
{
myDataRow[i] = dataReader[i].ToString();
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}
///关闭数据读取器
dataReader.Close();
return datatable;
}
catch(Exception ex)
{
///抛出类型转换错误
throw new Exception(ex.Message,ex);
}
}