使用DataAdapter的Fill方法返回包含多个数据表的DataSet

以下两种方案假定你使用的是SqlServer数据库,
采用了SqlClient命名空间,如果采用你采用OleDb或者Odbc命名空间,代码稍做修改就同样适用.
不过OracleClient命名空间因为没有环境就没有测试,估计第二种方案会麻烦一些,可以参考MS的kb.

1.在DataAdapter的SelectCommand的CommandText中直接采用批查询
例如:
 strSql = "SELECT * FROM Orders;SELECT * FROM Customers";
 SqlDataAdapter daData = new SqlDataAdapter(strSql,new SqlConnection("server=XLZHU;User ID=sa;Password=111111;database=Northwind"));
 //daData.TableMappings.Add("Table","Order_Info");
 //daData.TableMappings.Add("Table1","Customer_Info");
 DataSet dsData = new DataSet();
 daData.Fill(dsData); 
这样,dsData中就会有两个DataTable,分别为Table和Table1(去掉注释名称就为Order_Info和Customer_Info).

2.使用存储过程
例如:
   先写一个名为GetCustomers的存储过程,用来取得第二个数据表(使用上面的第二条语句"CREATE PROCEDURE GetCustomers  AS SELECT * FROM Customers");
   再写一个名为GetData的存储过程,在取得第一个数据表所需的数据后(第一条语句),继续Exec GetCustomers;
   例如:
     "CREATE PROCEDURE GetData  AS
  SELECT * FROM Orders
  EXEC GetCustomers" 
   代码可以这样写:
   SqlDataAdapter daData = new SqlDataAdapter();
   //daData.TableMappings.Add("Table","Order_Info");
   //daData.TableMappings.Add("Table1","Customer_Info");
   daData.SelectCommand = new SqlCommand();
   daData.SelectCommand.Connection = new SqlConnection("server=XLZHU;User ID=sa;Password=111111;database=Northwind");
   daData.SelectCommand.CommandType = CommandType.StoredProcedure;
   daData.SelectCommand.CommandText = "GetData";
   DataSet dsData = new DataSet();
   daData.Fill(dsData);
同样,我们也得到了两个DataTable, 分别为Table和Table1(去掉注释名称就为Order_Info和Customer_Info).

在实际开发中我们可结合情况使用其中一个方案,我倾向于第二种,毕竟在代码中硬编码冗长的Sql语句是件很不爽的事情.

posted @ 2004-05-19 12:24  xlzhu  阅读(2730)  评论(2)    收藏  举报