ADO.NET数据库编程
1、ADO.NET的相关概念。
Microsoft的新一代技术,是ADO组件的后继者。
主要目的是在.NETFramework平台存取数据。
提供一致的对象模型,可以存取和编辑各种数据源的数据,即对这些数据源,提供了一致的数据处理方式。
ADO.NET保存和传递数据是使用XML格式。可实现与其他平台应用程序以XML文件进行数据交换。
2、数据访问类库的名称空间
针对不同的数据源,使用不同名称空间的数据访问类库,即数据提供程序。常用的数据源包括四种:
Microsoft SQL Server数据源:使用System.Data.SqlClient名称空间。
OLEDB数据源:使用System.Data.OleDb名称空间。
ODBC数据源:使用System.Data.Odbc名称空间。
Oracle数据源:使用System.Data.OracleClient名称空间
要使用ADO.NET 来访问数据库,需要将相应的名称空间导入到应用程序中,如下:
System.Data是通用的名称空间,其中包含组成ADO.NET核心体系结构的所有类。
System.Data.Oledb 名称空间供ADO.NET 管理提供程序访问支持OleDb的数据源时使用。
System.Data.SQLClient名称空间供 SQL Server管理提供程序使用。该名称空间是专为 Microsoft SQL Server 而设计的,对于以前版本的 SQLServer,可以提高其性能。
如:usingSystem.Data;
using System.Data. SqlClient;
System.Data.OleDb和System.Data.SqlClient名称空间的类名称相同,只是字头不同。
之所以分成两组类,主要目的是提供一组最佳化SQL Server数据库存取的类。
OleDb字头的类是使用OLEDB提供者数据源的数据库。例如Access和Oracle等数据库。
Sql字头的类只能使用在SQL Server7.0以上版本,直接和服务器端的SQL Server通信,因为不通过OLE DB和ODBC,所以可以明显提升整体的执行效率。
3、ADO.NET的组成
ADO.NET 数据提供程序的四个核心对象:
Connection建立到指定资源的连接
Command对一个数据源执行命令。公开Parameters,在 Connection 的 Transaction 范围内执行。
DataReader从一个数据源读取的只读数据流。
DataAdapter填充一个 DataSet,解析数据源的更新。
ADO.NET是使用Connection对象建立与数据源的数据链路,然后使用Command对象执行命令来获取数据源的数据,对数据库来说就是使用SQL命令。
在获取数据源的数据后,就可以填入DataReader或DataSet对象,最后使用数据绑定在Web控件显示记录数据。
Connection对象
可以建立与数据源间的连接;对数据库来说,还负责初始化数据库。
有两种:OleDbConnection对象和SqlConnection对象。
Web服务器和数据库系统本属于两套不同的应用程序,通过ODBC或OLE DB可以打开数据源的数据库,Connection对象进一步将ASP.NET程序和数据库连接起来。
Command对象
可以对数据源执行命令,对数据库来说,就是执行SQL命令。
ASP.NET程序可以使用Command对象发送SQL命令来插入、删除、更新和查询数据表的记录。
需要先使用Connection对象建立数据库连接后,才能使用Command对象执行SQL命令。
两种:OleDbCommand对象和SqlCommand对象。
DataReader对象
可以从数据源使用Command对象执行命令,获取“只读”(Read-Only)和“只能向前”(Forward-Only)的流数据。
每次只能从数据源读取一行数据保存到内存。
获取的数据为只读,不允许插入、删除和更新记录,其目的是显示查询结果。
两种:OleDbDataReader对象和
SqlDataReader对象。
DataAdapter 和 DataSet 类满足了支持数据库访问的断开连接模型这一需求。
DataSet 是 ADO.NET 断开连接体系结构中主要的数据存储工具。填充 DataSet 时,必须创建一个 DataAdapter 来填充 DataSet。
DataAdapter 连接数据库,执行查询并填充 DataSet。当 DataAdapter 调用 Fill 或 Update 方法时,在后台完成所有的数据传输。每个 .NET Framework 的数据提供程序都有一个 DataAdapter 对象。 DataAdapter 能控制与现有数据源的交互。DataAdapter 也能将对 DataSet 的变更传输回数据源中。
一个 DataSet 代表一组完整的数据,包括表格、约束条件和表关系。DataSet 能够存储代码创建的本地数据,也能存储来自多个数据源的数据,并断开到数据库的连接。
DataSet和DataTable对象
DataSet对象是由DataTable对象组成的集合对象,可代表保存在内存的数据库。
每一个DataTable保存一个数据表的记录数据,并且可以设定数据表间的关联性。
属于System.Data名称空间,用DataAdapter类的方法Fill()将数据表的数据填入DataSet对象。
可以在DataTable对象中插入和删除行,即处理数据表的记录,最后使用DataAdapter类将DAtaTable对象中的数据更新到数据库。
4、使用ADO.NET SQL命令执行数据库操作
分为两种方式:
使用ADO.NET的Command对象配合SQL语法;
使用ADO.NET的DataSet对象;
(1)可用Command对象执行SQL命令;用Connection对象来建立数据库连接。
步骤:
导入所需的名称空间;
建立和打开数据库连接;
建立Command对象;
执行SQL命令处理数据库;
关闭数据库连接;
实例演示。
建立Connection对象的语法:
SqlConnection objcon;
objcon=new SqlConnection(strDbCon);
上述代码建立了名为objCon的SqlConnection对象。
strDbCon变量是数据源字符串,如:
strDbCon="Data Source=Q-PC\\SQLEXPRESS;Integrated Security=SSPI;uid=sa;pwd=;Initial Catalog=hangyun“
Data Source:指明服务器,本地或是IP地址
Integrated Security:设置为SSPI,使连接使用用户的windows登录
uid:配置在SQL Server中的用户名
pwd:与SQL Server的用户名匹配的密码
Initial Catalog:数据库的名字
上述字符串中以“;”分隔
建立好Connection对象后,就可以使用Open()方法打开数据库连接:
objCon.Open()
Connection对象的相关方法:
Open()和Close()
Connection对象的相关属性:
ConnectionString;ConnectionTimeout
Database;DataSource;
Provider;State
上述属性在连接打开后都成为只读属性;
在连接打开前,可以设定这些属性,如:
objCon.ConnectionTimeout=30
上述设定与在连接字符串中指定功能等同;
在打开数据库连接后,就可以建立Command对象来指定欲执行的SQL命令字符串:
SqlCommand objcom;
objcom = new SqlCommand(strsql, objCon);
上述代码使用SqlCommand类建立Command对象;第一个参数是SQL命令字符串;第二个参数是建立的Connection对象:
实例演示:使用sql语句SELECT CategoryID, CategoryName FROM Categories,创建查询表Categories的命令的代码如下:
SqlCommand cmd;
cmd=new SqlCommand("SELECT CategoryID,CategoryName FROM dbo.Categories",con)
Command对象的相关属性:
Parameters:用来访问输入及输出参数和返回值。
SqlCommand支持命名参数。添加到Parameters集合的参数的名称必须与SQL语句或存储过程中的参数标记的名称相匹配。
OleCommand不支持命名参数,用问号占位符标记参数,则向Parameters集合中添加参数的顺序必须与定义的参数顺序相匹配。
如:
SqlParameter param;
……
objcmd = newSqlCommand("select username,password from userinfo where username like@name ", objconn);
param = objcmd.Parameters.Add("name",SqlDbType.NVarChar, 15);
param.Value = tbname.Text;
SqlDataReader objdr = objcmd.ExecuteReader();
……
Command对象的相关属性:
CommandType:命令类型,
可选CommandType.StoredProcedure、
CommandType.Text、
CommandType.TableDirect
如:Sale是存储过程
cmd =new SqlCommand(“sale”,con)
cmd.CommandType=CommandType.StoredProcedure
在打开数据库连接,建立Command对象后,就可以用Command对象的ExecuteNonQuery()方法来执行SQL命令,如:
count=objCmd.ExecuteNonQuery()
Count可以获取响应的记录数。此方法不会回发记录数据。
Command对象公开了几个可用于执行所需操作的Execute方法:
ExecuteReader:当以数据流的形式返回结果时,使用ExecuteReader可返回DataReader对象。
ExecuteScalar:使用ExecuteScalar可返回单个值。
ExecuteNonQuery:使用ExecuteNonQuery可执行不返回行的命令。
使用DataReader对象的Read方法可从查询结果中获取行。
例如,循环显示SqlDataReader—dtr的数据的代码如下:
While(dtr.Read())
{
lblMessage+="<li>";
lblMessage+=dtr["ID"];
lblMessage+=", ";
lblMessage+=dtr["姓名"];
}
完成数据库操作后,使用Connection对象的Close()方法关闭数据库连接:
objCon.Close();
实例演示。
建立一个windows窗体应用程序,在默认的窗体中From1中,拖入一个TextBox,命名为Company。在From1后台加载程序中写入以下代码
//建立与数据库的连接
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=Q-PC\\SQLEXPRESS;Integrated Security=SSPI;uid=sa;pwd=;Initial Catalog=hangyun";
conn.Open();
//创建SQL命令,并执行
string sql = "select CompanyName from CompanyInfo_T where CompanyNum='164'";
SqlDataAdapter da = new SqlDataAdapter(sql,conn);
DataTable dt = new System.Data.DataTable();
try
{
da.Fill(dt);
}
catch (Exception e)
{
throw new Exception("执行任务失败"+e.Message+" "+sql);
}
finally
{
conn.Close();
}
CompanyName.Text = dt.Rows[0]["CompanyName"].ToString();//将数据库中获得的值显示到文本框中
//关闭连接
conn.Close();
结果如下: