ADO.NET 快速入门(四):从数据库填充 DataSet

从数据库获取数据很容易,处理数据更容易。如果想要从数据库获取只进、只读的数据流结果集,你可以使用 DataReader 执行命令并且检索它。关于如何使用 DataReader,请参考:使用 OLE DB 检索数据使用 SQL Server 检索数据。更多关于绑定、浏览、或者远程处理数据查询结果集的操作,你可以如下例所示把结果集放到 DataSet 里。
 
请记住最重的是,DataSet 是一种独立的有别于数据存储的数据结构。尽管示例从数据库获取数据,但是数据来源是无所谓的;DataSet 总是呈现出一种统一的编程模型。这是一个简单的关于关系型数据库收集数据的示例。由于数据来源不可知,DataSet 上没有加载、打开、或者执行操作。本节描述了如何使用 SqlDataAdapter 从数据库获取数据填充到DataSet。
 
你可以使用 Add 方法添加数据到 DataSet(请参考:从 DataSet 更新数据库),或者直接使用原生的XML方法(请参考:读写 XML 数据)推送数据。SqlDataAdapter 除了可以用于从数据库检索数据,也可以反向推送数据回数据库。这里,重点关注的是获取输出数据。
 
第一步是构建 SqlDataAdapter。也可以使用 SqlCommand 来构建 SqlDataAdapter。
 
    String SelectCmdString = "select * from customers";
    SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(SelectCmdString, myConnection);
    
    SqlCommand mySelectCommand = New SqlCommand("select * from customers", myConnection);
    SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(mySelectCommand);

 

除了 Fill 和 Update 方法以外,SqlDataAdapter 对象和 SqlCommand 对象非常类似。Fill 方法填充 DataSet 对象。Update 方法获取DataSet 的改动,并且把改动反映回数据库。这是 DataAdapter 上指定的4个命令完成的。这些命令是:SelectCommand、UpdateCommand、InsertCommand,和 DeleteCommand。你可以显式的指定这些命令,在运行时控制语句执行变动,包括使用存储过程。对于特别的场景,CommandBuilder 对象可以基于 select 语句  (参考:从 DataSet 更新数据库). 在运行时创建他们。然而,运行时创建需要一次额外的服务器往返以便收集必要的元数据,因此在设计时显式提供 insert、update、和 delete 命令可以得到更好的运行时性能。
 
备注:Visual Studio 建立了类型化 SqlDataAdapters 和 DataSets,并且最终为你创建存储过程。通过使用 ComponentDesigner 和数据库对象探究这个特性。
 
一旦创建了 SqlDataAdapter 对象,你就可以通过它来填充 DataSet。
 
    myDataSet = new DataSet();
    mySqlDataAdapter.Fill(myDataSet,"Customers");

 

当前的 DataSet 保存查询结果集。实际上,DataSet 可以从多个查询甚至关联他们的查询(请参考:使用关系型数据)保存结果集。因为保存了多个结果集,所以 DataSet 包含了一组表。请注意 Fill 方法允许“Customers”作为第二个参数。这是填充到 DataSet 中的表名。如果表不存在,就为你创建它。
 
因为数据是存储在表里一组行里面,所以你可以很容易使用 foreach 语句来迭代这些行:
 
    foreach (DataRow myDataRow in myDataSet.Tables["Customers"].Rows)
    {
      Console.WriteLine(myDataRow["CustomerId"].ToString());
    }

 

实际上,在列上同样可以使用foreach语句。下面的例子演示了本节所有的代码。了解如何更新数据回数据库,请参考:从 DataSet 更新数据库
 
    public class GettingDataExample
    {
        public void Run()
        {
            SqlConnection myConnection = new SqlConnection("server=(local);Integrated Security=SSPI;database=northwind");
            
            string selectCmdString = "SELECT * FROM Customers";

            // 构建 SqlDataAdapter
            SqlDataAdapter myDataAdapter1 = new SqlDataAdapter(selectCmdString, myConnection);

            // 使用 SqlCommand 构建 SqlDataAdapter
            SqlCommand mySelectCommand = new SqlCommand(selectCmdString, myConnection);
            SqlDataAdapter myDataAdapter2 = new SqlDataAdapter(mySelectCommand);

            DataSet myDataSet = new DataSet();
            myDataAdapter1.Fill(myDataSet, "Customers");

            // 迭代 DataSet
            foreach (DataRow myDataRow in myDataSet.Tables["Customers"].Rows)
            {
                Console.WriteLine(myDataRow["CustomerId"].ToString());
            }
        }
    }

 

 
posted @ 2013-11-18 16:39  安布雷拉  阅读(6383)  评论(1编辑  收藏  举报