ADO.NET常用对象
一、Connection对象
Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接。所有Connection对象的基类都是DbConnection类。
Connection对象有两个重要属性:
(1)ConnectionString:表示用于打开 SQL Server 数据库的字符串;
(2)State:表示 Connection 的状态,有Closed和Open两种状态。
Connection对象有两个重要方法:
(1)Open()方法:指示打开数据库;
(2)Close()方法:指示关闭数据库。
1 SqlConnection connection = new SqlConnection( "server=localhost;database=pubs;uid=sa;pwd=''";);
2 //注意,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")是将当前时间格式化为类似于2008-10-09 00:00:03的形式的字符串
3 Response.Write("时间"+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"当前数据库连接状态是:"+connection.State +"<br/>");
4 connection.Open();
5 Response.Write("时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "当前数据库连接状态是:" + connection.State + "<br/>");
6 connection.Close();
7 Response.Write("时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "当前数据库连接状态是:" + connection.State + "<br/>");
【技巧】利用Visual Studio数据源控件生成数据库连接字符串。根据向导“新建连接”后,会出现一个“添加连接”的对话框,在这里可以根据实际需要更改数据源。这个连接向导配置连接到Access数据库文件、ODBC数据源、SQL Server数据库、SQL Server手机版数据库、SQL Server数据库文件、Oracle数据库文件及其它数据库。 在这里我们选择Microsoft SQL Server选项,连接到SQL Server数据库。如果我们在局域网中,我们可以点击“添加连接”界面中的刷新按钮来查看局域网中有哪些SQL Server数据库可以连接。连接到数据库可以用下面的方式:
(1)如果要连接的数据库服务器与开发者的机器在同一个局域网里,可以使用局域网IP地址或者局域网中的电脑主机名;
(2)如果要连接的数据库服务器与开发者的机器不在同一个局域网内,那么就要求数据库服务器必须有一个公网IP,我们可以使用公网IP来连接,如果数据库服务器还有互联网域名,那么用互联网域名也是可以的。
(3)如果要连接的数据库服务器与开发者所使用的机器是同一台机器,那么可以使用以下几种方式之一:”(local)”或者”.”或者”127.0.0.1”。需要注意的是,如果在一台机器上运行者同一种数据库的不同版本,比如说在”xxxxx”这台主机上同时运行着SQL 2000、SQL 2005和SQL Express三种版本,并且它们所使用的Windows服务名分别为”SQL2000”、”SQL2005”和”SQLExpress”,那么我们要连接到SQL 2000这个数据库上所使用的服务器名就应该填写”xxxxx\SQL2000”这种“主机名\实例名”的方式或者“主机IP\实例名”,这种情况在同时安装了Visual Studio 和SQL 的朋友那里很常见,因为SQL Express是针对学生的功能有限的免费版本,这个版本的数据库在安装Visual Studio 时默认是一同安装的。点击一下“测试连接”按钮,如果弹出连接成功的提示消息就表示这个数据库连接是可用的。点击“确定”按钮,回到“配置数据源”界面,这时候点击连接字符串旁边的”+”按钮就可以看到数据库的连接字符串信息。
二、Command对象
Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
Command主要有三个方法:
ExecuteNonQuery():执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。
OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath("person.mdb"); conn.Open(); string strSQL = "insert into grade values(12,'女','小张',78,86,98)"; OleDbCommand Comm = new OleDbCommand(strSQL, conn); Comm.ExecuteNonQuery(); conn.Close();
ExecuteReader ():执行一个查询的SQL语句,返回一个DataReader对象。
SqlConnection Conn = new SqlConnection(); Conn.ConnectionString = "server=localhost;database=pubs;uid=sa;pwd=''"; Conn.Open(); SqlCommand Comm = new SqlCommand("select * from Authors", Conn); SqlDataReader dr = Comm.ExecuteReader(); dg.DataSource = dr; dg.DataBind(); Conn.Close();
ExecuteScalar ():从数据库检索单个值。这个方法主要用于统计操作。ExecuteScalar ()这个方法是针对SQL语句执行的结果是一行一列的结果集,这个方法只返回查询结果集的第一行第一列。
OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + Server.MapPath("person.mdb"); conn.Open(); string strSQL = "select avg(数学) from grade"; OleDbCommand Comm = new OleDbCommand(strSQL, conn); double d = (double)Comm.ExecuteScalar(); Message.Text = "所有人数学的平均成绩为:"+d.ToString()+"分"; conn.Close();
【注意】在操作数据库的时候,为了提高性能,都遵循一个原则:数据库连接对象应该尽可能晚打开,尽可能早关闭。在上面的例子中,在Command对象需要执行数据库操作之前才打开数据库连接对象,执行数据库操作之后马上就关闭了数据库连接对象。
三、DataReader对象
DataReader对象是一个读取行的只读流的方式,绑定数据时比使用数据集方式性能要高,因为它是只读的,所以如果要对数据库中的数据进行修改就需要借助其它方法将所作的更改保存到数据库。
DataReader对象不能通过直接实例化,必须借助与相关的Command对象来创建实例,例如用SqlCommand的实例的ExecuteReader()方法可以创建SqlDataReader实例。因为DataReader对象读取数据时需要与数据库保持连接,所以在使用完DataReader对象读取完数据之后应该立即调用它的Close()方法关闭,并且还应该关闭与之相关Connection对象。在.net类库中提供了一种方法,在关闭DataReader对象的同时自动关闭掉与之相关的Connection对象,使用这种方法是可以为ExecuteReader()方法指定一个参数,如: SqlDataReader reader =command.ExecuteReader(CommandBehavior.CloseConnection); CommandBehavior是一个枚举,上面使用了CommandBehavior枚举的CloseConnection值,它能在关闭SqlDataReader时关闭相应的SqlConnection对象。
并且DataReader对象读取数据有三种方式:
一种是按查询的时候列的索引用指定的方式来读取列值,无需做相应转换,如GetByte(int i)就是读取第i列的值并且转换成byte类型的值。第这种方法的优点是指定列后直接将该列的直接读取出来了,无需再转换,缺点是一旦指定的列不能按照指定的方式转换时就会抛出异常,比如数据库里字段的类型是string类型或者该字段的值为空时按照GetByte(i)这种方式读取会抛出异常。
第二种方式就是按照列索引的方式读取,在读取的时候并不进行值转换,如:reader[5]就是读取第5列的值(这里reader是一个Reader对象的实例),这样得到的值是一个object类型的值,这也很好理解,因为在数据库可能存储各种类型的值,而object是所有类的基类,所以这个方法不会抛出异常。如果要得到它的正确类型,还需要根据数据库里的字段进行进行相应转换。
最后一种是按照列名的方式去读,并且在读的时候也不进行相应转换,得到的是object类型的值。 综合前面三种方式各有特点,第一种方式最直接,但是有可能抛出异常,第二种方式比第一种稍微灵活一些,我们可以根据读取到值为空(在.net里用DBNull类来表示,可以表示数据库中任意数据类型的空值),我们就不进行相应的类型转换,避免出现异常。第三种方式按照列的名字来读取数据,也需要按照第二种方式进行一定的转换。就性能来说第一种最高,第二种稍低,第三种最低(这很好理解,假设要在一个旅馆里找人直通过房间号找肯定比通过名字找快),就灵活性来说第三种最灵活,第二种次之,第一种最不灵活(假如在后来编写SQL语句中更改了列的索引,第一种和第二种都可能出现问题)。实际开发中根据实际情况选择合适的方式。
使用 DataReader 检索数据的步骤:
1、创建 Command 对象
2、调用 ExecuteReader() 创建 DataReader 对象
3、使用 DataReader 的 Read() 方法逐行读取数据
4、读取某列的数据,(type)dataReader[ ]
5、关闭 DataReader 对象
注意:DataReader 使用后必须关闭
参考代码:
string sql = "SELECT StudentName FROM Student WHERE StudentName LIKE '李%'"; SqlCommand command = new SqlCommand(sql, connection); connection.Open(); SqlDataReader dataReader = command.ExecuteReader(); Console.WriteLine("查询结果:"); while (dataReader.Read()) { Console.WriteLine((string)dataReader["StudentName"]); } dataReader.Close();
四、DataAdapter对象
DataAdapter对象也称之为数据适配器对象,DataAdapter对象利用数据库连接对象(Connection)连接的数据源,使用数据库命令对象(Command)规定的操作从数据源中检索出数据送往数据集对象(DataSet),或者将数据集中经过编辑后的数据送回数据源。 数据适配器将数据填入数据集时调用方法Fill(),语句如下:
//直接填充表
dataAdapter1.Fill (dataTable);
或者
//填充dataSet11数据集中的"Products"表
dataAdapter1.Fill (dataSet11, "Products");
当dataAdapter1调用Fill() 方法时将使用与之相关联的命令组件所指定的 SELECT 语句从数据源中检索行。然后将行中的数据添加到 DataSet 中的DataTable 对象中或者直接填充到DataTable的实例中,如果 DataTable 对象不存在,则自动创建该对象。 当执行上述SELECT语句时,与数据库的连接必须有效,但不需要用语句将连接对象打开。如果调用Fill()方法之前与数据库的连接已经关闭,则将自动打开它以检索数据,执行完毕后再自动将其关闭。如果调用Fill()方法之前连接对象已经打开,则检索后继续保持打开状态。
注意:一个数据集中可以放置多张数据表。但是每个数据适配器只能够对应于一张数据表。
五、DataSet对象
DataSet对象也称为数据集对象,DataSet对象用于表示那些储存在内存中的数据,它相当于一个内存中的数据库。它可以包括多个DataTable对象及DataView对象。DataSet主要用于管理存储在内存中的数据以及对数据的断开操作。 由于DataSet对象提供了一个离线的数据源,这样减轻了数据库以及网络的负担,在设计程序的时候可以将DataSet对象作为程序的数据源。
六、DataTable对象
DataTable 是 ADO.NET 库中的核心对象,就像普通的数据库中的表一样,它也有行和列。它主要包括DataRow和 DataColumn,分别代表行和列。
(1) 数据行(DataRow)
数据行是给定数据表中的一行数据,或者说是数据表中的一条记录。它可能代表一个学生、一位用户、一张订单或者一件货物的相关数据。DataRow对象的方法提供了对表中数据的插入、删除、更新和查看等功能。提取数据表中的行的语句如下:
DataRow dr = dt.Rows[n];
其中:DataRow代表数据行类;dr是数据行对象;dt代表数据表对象; n代表行的序号(序号从0开始)。
(2) 数据列(DataColumn)
数据表中的数据列(又称字段)定义了表的数据结构,例如,可以用它确定列中的数据类型和大小,还可以对其他属性进行设置。例如,确定列中的数据是否是只读的、是否是主键、是否允许空值等;还可以让列在一个初始值的基础上自动增殖,增值的步长还可以自行定义。 某列的值需要在数据行的基础上进行。语句如下:
string dc = dr.Columns["字段名"].ToString(); 或者 string dc = dr.Column[i].ToString();//i表示对应的列索引
如若想取出数据表(dt)中第3条记录中的“姓名”字段,并将该字段的值放入一输入框(textBox1)中时,语句可以写成:
DataRow dRow = dt.Rows[2 ]; // 从数据表提取行 string textBox1.Text=dRow["CompanyName"].ToString(); // 从行中取出字段的值
一个基本的例子
//实例化Connection对象
SqlConnection connection = new SqlConnection("Data Source=(local);
Initial Catalog=数据库名;Persist Security Info=True;User ID=sa;Password=sa");
connection.open();
//要执行查询,则先需要实例化Command对象,
SqlCommand command = new SqlCommand("select * from UserInfo where sex=0", connection);
SqlDataAdapter adapter = new SqlDataAdapter(command);
/*
下面的被注释掉的代码与上面的代码是等效的
SqlDataAdapter adapter = new SqlDataAdapter("select * from UserInfo where sex=0",connection);
*/
DataTable data = new DataTable();
adapter.Fill(data);
/* 下面的被注释掉语句与上面填充DataTable的效果是一样的,我更倾向于没有注释掉的部分
DataSet ds = new DataSet();//实例化DataSet
adapter.Fill(ds, "UserInfo");//填充ds中的"UserInfo"表
DataTable data = ds.Tables["UserInfo"];
*/
connection.close();