从数据库获取数据很容易,处理数据更容易。如果想要从数据库获取只进、只读的数据流结果集,你可以使用 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()); } } }