正确使用DataSet .Data Table 和DataReader

参照
Why I Don't Use DataSets in My ASP.NET Applications(by Scott Michell)
http://aspnet.4guysfromrolla.com/articles/050405-1.aspx

Performance Comparison: Data Access Techniques
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdadotnetarch031.asp

首先需要理解DataSet 和 DataReader的设计目标:
DataSet可以理解成一个小型的,存在于内存中的数据库,包含多个data table,table之间
可存在约束关系.
DataSet和数据库无关,由DataAdapter来负责对数据库的处理,一旦数据填充结束,就和数据库
断开连接.
DataSet对XML的支持比较好.

DataReader可以理解成程序和数据库之间的桥梁.只能顺序的,从数据库中读取记录.
DataReader是和数据库相关的,所以存在sql, ole等多个版本的DataReader.

从使用上来看,

使用DataReader需要以下步骤:
// 1. 建立连接
SqlConnection myConnection = new SqlConnection(conn);

// 2. 执行查询
SqlCommand myCommand = new SqlCommand(myConnection, sqlText);

SqlReader myReader = myCommand.ExecuteReader();

// 3. Read
while(myReader.Read())
{

}

// 4. Close connection
myConnection.Close();

使用DataSet需要以下步骤:
// 1. 建立连接
SqlConnection myConnection = new SqlConnection(conn);

// 2. 生成command 和 adapter
SqlCommand myCommand = new SqlCommand(myConnection, sqlText);
SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);

// 3. 生成dataset并填充
DataSet myDataSet = new DataSet();
myAdapter.Fill(myDataSet);

// 4. Close connection
myConnection.Close();

如果使用UIControlo显示数据,对于dataset和datareader的操作是相同的:
把dataset或datareader赋给control的DataSource属性,
再调用control的DataBind()方法.

比较:
DataSet的性能比DataReader差很对,同时占用大量的内存.

何时使用DataSet:
1.数据传输.
2.桌面应用.

在ASP.Net 2.0中DataTable进行了以下的扩展和增强:

--dataTable可以独立于dataset而存在,
--dataTable可从datareader中读取数据:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    // Create a Command
    using (SqlCommand command = new SqlCommand(Sql, connection))
    {
        // Call ExecuteReader to return a DataReader
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Create a DataTable
            DataTable table = new DataTable();
            // Fill DataTable
            table.Load(reader, LoadOption.OverwriteChanges);
            // Display data in GridView
            dataGridView1.DataSource = table;                     
          }
  }
}
--也可用Adapter填充

SqlDataAdapter adapter = new SqlDataAdapter(Sql, connection);
DataTable table = new DataTable("Employees");
adapter.Fill(table);

--用DataTableReaderCreate(it is disconnected)从datatable中读取数据:
DataTableReader dtReader = table.CreateDataReader();
while (dtReader.Read())
{
    str = dtReader.GetValue(0).ToString();
}

如果
DataTableReader dtReader = dataset.CreateDataReader();
dtRader会读取DataSet中所有DataTable的数据.



--可以merge多个data table

dtTable1.Merge(dtTable2);

--Serialize的支持,从而可以在web method中传递DataTable
DataTable table = new DataTable();

table.Load(reader, LoadOption.OverwriteChanges);
//  设置序列化的格式,default为SerializationFormat.Xml
table.RemotingFormat = SerializationFormat.Binary;

BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("Data.txt", FileMode.OpenOrCreate);
bf.Serialize(fs, table);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值