6,用DataSet读取数据
DataSet是Ado.Net中的核心对象,所有复杂级别的操作都使用它。DataSet包含一组DataTable对象,他们表示操作的数据库表。DataSet的常见操作使用DataAdapter对象Fill方法给他填充数据为什么Fill方法是DataAdapter对象的方法,而不是DataSet的方法呢,因为DataSet是内存中数据的一个抽象表示,而DataAdapter对象是把DataSet和具体的数据库联系起来的对象,Fill方法有很多重载版本,本例中使用两个参数的,第一个指定要填充的DataSet,第二个参数是DataSet中要包含所加载数据的DataTable名称。DataSet对象有一个Tables属性,他是DataSet中所有DataTable对象的集合。Tabels的类型是DataTableCollection,他有一个重载的索引符,于是可以用两种方式访问每个DataTable
【1】按表名访问:thisDataSet.Tables[“Customers”]
【2】按索引访问:thisDataSet.Tables[0]
每一个DataTable都有一个Rows属性,他是DataRow对象的集合。Rows的类型是DataRowCollection,是一个有序列表,按行号排序。例:myDataSet.Tables[“Customers”].Rows[n]表示在thisDataSet的DataTable对象Customers中指定行号n-1(索引是基于0的)。当然也可以使用其他索引语法来制定DataTable。我们希望DataRow也有一个DataColumnCollection类型的属性,但是事实并不是那么简单,因为要利用那个每一行各个列中的数据类型,是包含字符数据的列是一个字符串,包含整数的列是一个整数对象等等。DataRow有一个重载的索引,允许按列名和列号访问各个列。
thisDataSet.Table[“Customers”].Rows[n][“CompanyName”]
在thisDataSet的DataTable对象Customers中指定行号为n-1的CompanyName列,这里DataRow对象是thisDataSet.Tables[“Customers”].Rows[n],上述结构有点混乱,给出了其图形显示。
程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data; //注意
using System.Data.OracleClient; //Oracle数据库
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
//Data Source=orcl;User ID=shibei;Password=nsic;Unicode=True
OracleConnection thisConnection = new OracleConnection(@"Data Source=orcl;User ID=shibei;Password=nsic;Unicode=True");
// thisConnection.Open();//此处可以不用打开
OracleDataAdapter thisAdapter = new OracleDataAdapter("select * from N_AIT", thisConnection);
DataSet thisDataSet = new DataSet();
thisAdapter.Fill(thisDataSet, "MY_N_AIT");//MY_N_AIT不是表名而是DataTable对象的名称
foreach (DataRow theRow in thisDataSet.Tables["MY_N_AIT"].Rows)//注意与上面的MY_N_AIT要对上哦
{
Console.WriteLine(theRow["ID"] + "\t" + theRow["NAME"]);//除了用名字也可以用索引号
}
thisConnection.Close();//这个例子中没有明确打开连接,因为DataAdapter对象完成了这个工作,
//数据授权对象会根据需要打开连接,在完成工作后关闭它。
//DataAdapter对象不改变连接的状态,如果DataAdapter对象开始其工作前连接时打开的,
//在DataAdapter对象完成其工作后,连接仍是打开的。( 不懂既然DataAdapter来处理为什么不改变连接的状态)
}
}
}
运行结果同上。
注意:DataReader工作时必须要维护数据库的连接,而且只能向前的方式读取数据,可以浏览记录或跳到某一记录上。而且只能读取记录。而用DataAdapter对象填充了DataSet,DataAdapter对象需要处理连接的打开和关闭。DataSet为数据的读写以及操作不同数据源中的数据提供了极大的灵活性。下面相继介绍。