ADO.NET中的五个主要对象:Connection、Command、DataAdapter DataSet、DataReader详细介绍与应用,感兴趣的朋友可以参考下
对象名 | 简述 |
---|---|
Connection: | 数据库交互必不可少的步骤。用于建立到数据源的连接 |
Command: | 对数据库发出指令操作,例如对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection 对象上,也就是Command 对象是通过Connection连结到数据源的。 |
DataAdapter: | 主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。 |
DataSet: | 这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。 |
DataReader: | 当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。 |
Connection:
重要属性:
- ConnectionString 属性,连接字符串,可以通过ConnectionStringBuilder去生成,也可以通过配置文件来配置信息:
<add name="ConStr" connectionString="Data Source=实例名;Initial Catalog=DBName;User ID=****;Password=******" providerName="System.Data.SqlClient" />
- State 属性,表示 SqlConnection 的状态。为ConnectionState的枚举值,常用包括:
- Closed:连接已关闭。
- Open:连接处于打开状态。
SqlConnection connection;
public SqlHelper()
{
connection = new SqlConnection(ConnectString());
}
//获取连接字符串
private string ConnectionString(){
return ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
}
//打开连接
private SqlConnection GetConnection(){
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
return connection;
}
//关闭连接
public void CloseConnection()
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
}
重要方法:
- Open() 方法,使用由 ConnectionString 指定的属性设置打开一个数据库连接。
- Close() 方法,关闭与数据库之间的连接。 此方法是关闭任何打开连接的首选方法。
- Dispose() 方法,执行与释放或重置非托管资源关联的应用程序定义的任务。
Command:
重要属性:
- Connection ,获取或设置 SqlCommand 的此实例使用的 SqlConnection。
- CommandText,获取或设置要在数据源中执行的 Transact-SQL 语句、表名或存储过程。
- Parameters,获取 SqlParameterCollection,用于传递参数对象。
- Transaction,获取或设置要在其中执行 SqlTransaction 的 SqlCommand。
重要方法:
- ExecuteNonQuery(),对连接执行 增删改的Transact-SQL 语句并返回受影响的行数。
- ExecuteReader(),将 CommandText 发送到 Connection,并生成 SqlDataReader对象返回。
- ExecuteScalar(),执行查询,并返回查询所返回的结果集中第一行的第一列。 忽略其他列或行。
- Dispose(),执行与释放或重置非托管资源关联的应用程序定义的任务。
重要事件:
- Disposed,在通过调用 Dispose() 方法释放组件时发生。
/// <summary>
/// 执行带参数的增删改SQL语句或存储过程
/// </summary>
/// <param name="cmdText">增删改SQL语句或存储过程名字</param>
/// <param name="ct">命令类型</param>
/// <param name="paras">参数列表</param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdText, CommandType ct, SqlParameter[] paras)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConnection()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
CloseConnection();
return res;
}
DataAdapter:
重要属性:
- SelectCommand,获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
- InsertCommand,获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
- UpdateCommand,获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
- DeleteCommand,获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
示例代码:
public static SqlDataAdapter CreateCustomerAdapter(
SqlConnection connection)
{
SqlDataAdapter adapter = new SqlDataAdapter();
// 创建 SelectCommand.
SqlCommand command = new SqlCommand("SELECT * FROM Customers " +
"WHERE Country = @Country AND City = @City", connection);
// 添加参数到 SelectCommand.
command.Parameters.Add("@Country", SqlDbType.NVarChar, 15);
command.Parameters.Add("@City", SqlDbType.NVarChar, 15);
adapter.SelectCommand = command;
// 创建 InsertCommand.
command = new SqlCommand(
"INSERT INTO Customers (CustomerID, CompanyName) " +
"VALUES (@CustomerID, @CompanyName)", connection);
// 添加参数到 InsertCommand.
command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
adapter.InsertCommand = command;
// 创建 UpdateCommand.
command = new SqlCommand(
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
"WHERE CustomerID = @oldCustomerID", connection);
// 添加参数到 UpdateCommand.
command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
SqlParameter parameter = command.Parameters.Add(
"@oldCustomerID", SqlDbType.NChar, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;
adapter.UpdateCommand = command;
// 创建 DeleteCommand.
command = new SqlCommand(
"DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);
// 添加参数到 DeleteCommand.
parameter = command.Parameters.Add(
"@CustomerID", SqlDbType.NChar, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;
adapter.DeleteCommand = command;
return adapter;
}
/// <summary>
/// 执行带参数的查询SQL语句或存储过程
/// </summary>
/// <param name="cmdText">查询SQL语句或存储过程名字</param>
/// <param name="ct">命令类型</param>
/// <param name="paras">参数集合</param>
/// <returns>返回DataSet结果集</returns>
public DataSet ExecuteQuery(string cmdText, CommandType ct, SqlParameter[] paras)
{
cmd = new SqlCommand(cmdText, GetConnection());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
CloseConnection();
return ds;
}
重要方法:
- Fill方法,填充数据集。通常会向DataSet中填充。
- Update方法,更新数据源。
DataSet:
- DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。也就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的。
- 创建和刷新 DataSet 并依次更新原始数据的步骤:
- 通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
- 通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。
- 调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为参数传递。
- DataSet所有数据都加载在内存上执行的,可以提高数据访问速度,提高硬盘数据的安全性,极大的改善了程序运行的速度和稳定性。
- 每一个DataSet对象是由若干个 DataTable对象组成。
- DataSet使用方法:
- 把数据库中的数据通过DataAdapter对象填充DataSet。
- 通过DataAdapter对象操作DataSet实现更新数据库。
- DataSet对象的三大特性
- 独立性。DataSet独立于各种数据源。
- 离线(断开)和连接。
- DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。
DataReader:
若要创建 SqlDataReader ,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不是直接使用构造函数。
在使用SqlDataReader时,关联的SqlConnection正忙于为SqlDataReader提供服务,除了关闭它之外,不能在SqlConnection上执行其他操作。直到调用SqlDataReader的Close方法之前都是这样。例如,只有在调用Close之后才能检索输出参数
重要属性:
- Connection,获取与 SqlConnection 关联的 SqlDataReader。
- FieldCount,获取当前行中的列数。
- HasRows,获取一个值,该值指示 SqlDataReader 是否包含一行还是多行。
- IsClosed,检索一个布尔值,该值指示是否已关闭指定的 SqlDataReader 实例。
- Item[Int32],在给定列序号的情况下,获取指定列的以本机格式表示的值。
- Item[String],在给定列名称的情况下,获取指定列的以本机格式表示的值。
重要方法:
- Close(),关闭 SqlDataReader 对象。
- Dispose(),释放 DbDataReader 类的当前实例所使用的所有资源。
- Read(),让 SqlDataReader 前进到下一条记录。
/// <summary>
/// 执行带参数的查询SQL语句或存储过程
/// </summary>
/// <param name="cmdText">查询SQL语句或存储过程名字</param>
/// <param name="ct">命令类型</param>
/// <param name="paras">参数集合</param>
/// <returns>返回DataReader结果集</returns>
public SqlDataReader ExecuteReader(string cmdText, CommandType ct, SqlParameter[] paras)
{
cmd = new SqlCommand(cmdText, GetConnection());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
try
{
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return reader;
}
catch
{
connection.Close();
throw;
}
}