ADO.NET是一个中间数据访问层,提供了用于访问特定数据库、执行SQL语句并且接受数据库数据的命令,在数据库与ASP.NET应用程序之间提供了一座桥梁。ADO.NET本身也是基于多层架构设计,除了能应用于普通的应用程序意外,在分布式系统开发中也具有同样强大的功能。

一. ADO.NET的对象

对象 描述
Connection 数据库连接对象,建立与物理数据库的连接。
Transaction 数据库事务对象,与事务处理相关的类。
DataAdapter 适配器对象,一方面从数据库中获取数据并填充到DataSet对象中,另一方面用来将DataSet中的更改数据更新到数据库中。该对象介于连接对象与非连接对象之间。
Command 数据命令对象,可向数据库发送增删查改等操作的SQL语句。
Parameter 参数对象,为Command对象中的SQL语句提供参数。
DataReader 数据读取器对象,提供读取下一条记录的数据的游标,用于读取数据。

ADO.NET中的大多数类位于System.Data命名空间及其子命名空间中。

在SQL数据库操作时,需要引入以下命名空间:

using System.Data;
using System.Data.SqlClient;

二. 使用SqlConnection对象连接数据库

1. 创建SqlConnection对象实例

1 . 方法1:

SqlConnection con = new SqlConnection(strConnection);

2 . 方法2:

SqlConnection con = new SqlConnection();
con.ConnectionString = strConnection;

2. 连接SQl Server数据库的字符串

Server=(Local); pwd=password; uid=userId; database=myDB;

3. 打开数据库

con.Open();

4. 关闭数据库连接

con.Close();

实例:

// 连接字符串
string ConnectionString = "Server=(Local); pwd=password; uid=userId; database=myDB;";
// 创建SqlConnection实例:
SqlConnection conn = new SqlConnection(ConnectionString);
try{
   // 打开数据库连接
    conn.Open();
    // 如果当前连接状态打开,则在控制台上显示输出
    if(conn.State == ConnectionState.Open) {
        Response.Write("当前数据库已经连接!" + "\n");
        Response.Write("连接字符串为:" + conn.ConnectionString);
    }
    // 关闭数据库
    conn.Close();
}catch {
    if(conn.State != ConnectionState.Open) {
        Response.Write("未连接数据库!");
    }
}

三. 使用web.config配置数据库连接

1. Web.config配置

<connectionStrings>
    <add name="textDB" providerName="System.Data.SqlClient" connectionString="server=127.0.0.1;database=textDB;uid=admin;pwd=admin"/>
  </connectionStrings>

其中,

  • name:用于保存连接字符串的名字;
  • connectionString:连接数据库的字符串;
  • providerName:数据库提供者;

2. 获取web.config文件中的连接字符串

需要引入以下命名空间:

using System.Web.Configuration;

获取web.config的连接字符串:

string ConnectionString = WebConfigurationManager.ConnectionStrings["textDB"].ConnectionString;

还可以做一个取得连接字符串的私有函数getConnectionString,如下:

private string getConnectionString() {
    return WebConfigurationManager.ConnectionStrings["textDB"].ConnectionString;
}

要访问、操作数据库首先得连接数据库,最好的方法是在web.config文件的<connectionStrings>字段中添加操作数据库字符串。

事实上,使用using方法连接数据库,对系统更安全。

using(SqlConnection conn = new SqlConnection(connectionString)) {
    // 创建Command对象
    conn.Open();
    // 执行command对象操作
    // 利用数据库SqlTransaction、DataSet、DataReader、DataTable等进行数据库操作
    // 关闭数据库连接
    conn.Close();
}

四. 使用Command对象操作数据库

使用Connection对象与数据源建立连接后,可使用Command对象对数据源进行查询、添加、修改和删除操作。根据.NET Framework数据提供程序的不同,Command对象可分成4种,分别是SqlCommand、OleDBCommand、OdbcCommand和OracleCommand对象。连接 SQL Server使用的是SqlCommand对象。

SqlCommand是ADO.NET提供的执行数据库操作的指令的类,能对SQL Server数据库执行一个Transact-SQL语句或存储过程。SqlCommand先通过构造函数来创建SqlCommand对象,再由创建的SqlCommand对象执行SQL命令或存储过程返回的执行的结果。

1. SqlCommand对象的构造方法

(1) 初始化SqlCommand实例:

SqlCommand command = new SqlCommand();

(2) 用查询文本初始化SqlCommand实例:

SqlCommand command = new SqlCommand("select * from User");

(3) 指定要执行的指令和SqlConnection对象实例构造SqlCommand实例:

SqlConnection conn = new SqlConnection();
SqlCommand command = new SqlCommand("select * from User", conn);

(4) 使用查询文本、SqlConnection和SqlTransaction来初始化SqlCommand实例:

SqlConnection conn = new SqlConnection();
SqlTransaction transaction = conn.BeginTransaction("SampleTransaction");
SqlCommand command = new SqlCommand("select * from User", conn, transaction);

2. SqlCommand对象属性

属性 描述
CommandText 获取或设置要对数据源执行的Transact-SQL语句或存储过程。
CommandTimeout 获取或设置在终止执行命令的尝试并发生错误之前的等待时间。
CommandType 获取或设置一个值,该值指示如何解释CommandText。
Connection 获取或设置SqlCommand实例使用的SqlConnection对象。
DesignTimeVisible 指示SqlCommand对象是否在Windows窗体设计器空间中可见
Notification 获取或设置一个指定与此SqlCommand对象绑定的SqlNotificationRequest对象的值。
NotificationAuto Enlist 用于指示应用程序是否自动接收来自公共SqlDeoendecy对象的查询通知。
Parameters 获取SqlParameterCollection对象。
Transaction 获取或设置将在其中执行Sqlcommand实例的SqlTransaction对象。
UpdatedRowSource 获取或设置命令结果在由DbDataAdapter类的"Update"方法使用时,如何应用DataRow对象。

Command属性有3个枚举值:

  • Text:默认值,表示SQL文本命令;
  • StoredProcedure:表示存储过程;
  • TableDirect:表示一个表的名称;

实例:

1) 在Web.config中:

<connectionStrings>
    <add name="textDB" providerName="System.Data.SqlClient" connectionString="server=127.0.0.1;database=textDB;uid=admin;pwd=admin"/>
  </connectionStrings>

2) 在"textDB"数据库中新建名为"User"的数据表,分别建立"name"和"password"两个字段。向数据表中输入一些测试数据。如下:

此处输入图片的描述

3)在ASP.NET程序中:

string connectionString = WebConfigurationManager.ConnectionStrings["textDB"].ConnectionString;
// 由于"User"为SQL系统保留字,因此需要加上"[]"才能表示用户自定义的字段
string queryString = "select * from [User]";
using (SqlConnection conn = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand();
    command.Connection = conn;
    command.CommandTimeout = 15;
    command.CommandType = CommandType.Text;
    command.CommandText = queryString;
    conn.Open();
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Response.Write("userName: " + reader[0] + "<br /> <hr />");
        Response.Write("Password: " + reader[1] + "<br />");
    }
    conn.Close();
}

效果图如下:

此处输入图片的描述

3. SqlCommand对象的方法

方法 描述
BeginExecuteNonQuery 启动此SqlCommand对象描述的Transact-SQL语句或存储过程的异步执行。
BeginExecuteReader 启动此SqlCommand对象描述的Transaction-SQL语句或存储过程的异步执行,并从服务器中检索一个或多个结果。
BeginExecuteXmlReader 启动此SqlCommand对象描述的Transact-SQL语句或存储过程的异步执行,并将结果作为XmlReader对象返回。
Cancel 尝试取消SqlCommand对象的执行。
Clone 创建作为当前实例副本的新SqlCommand对象。
CreateParameter 创建SqlCommand对象的新实例。
Dispose 释放由SqlCommand对象占用的资源。
EndExecuteNonQuery 完成Transaction-SQL语句的异步执行。在不适用DataSet的情况下更改数据库中的数据。
EndExecuteReader 完成Transaction-SQL语句的异步执行,将请求的数据以XML形式返回。
ExecuteNonQuery 对连接执行Transaction-SQL语句并返回受影响的行数。
ExecuteReader 将CommandText对象发送给SqlConnection对象,并生成一个SqlDataReader对象。
ExecuteScalar 执行查询,并返回查询所返回的结果集中第一行的第一列,忽略其他列或行。
ExecuteXmlReader 将CommandText对象发送到SqlConnection对象并生成一个XmlReader对象。
Prepare 在SQL Server的实例上创建命令的一个准备副本。
ResetCommandTimeout 将CommandTimeout属性重置为默认值。

使用SqlCommand对象操作数据库一般有以下3种方法:

  • ExecuteNonQuery():可对数据库进行增删查改操作;
  • ExecuteScalar():返回结果集中第一行的第一列;
  • ExecuteReader():须赋予给一个DataReader对象,通过DataReader对象去读取数据内容;

五. 使用DataSet对象和DataAdapter对象操作数据库

DataSet表示包括相关表、约束和表间关系在内的整个数据集

DataSet主要通过DataAdapter对象从关系数据源中对其进行数据填充。

DataAdapter从连接类(如SqlCommand对象中)获取数据库的结果,然后将结果填充到非连接数据集如DataSet或DataTable中,同时非连接数据集也会使用DataAdapter来更新其所做的更改。

如果DataAdapter所连接的是SQLServer数据库,则可通过将SqlDataAdapter与关联的SqlCommand和SqlConnection对象一起使用,从而提高总体性能。

填充DataSet的步骤如下:

  • 1)填充DataSet对象或DataTable(如ds或dt);
  • 2)建立SqlDataAdapter对象(如myDataAdapter);
  • 3)myDataAdapter.Fill(ds或dt);

1. SqlDataAdapter类

SqlDataAdapter包括SelectCommand、InsertCommand、DeleteCommand、UpdateCommand和TableMappings属性,以便于数据的加载和更新。

1. SqlDataAdapter类的常用属性

属性 描述
AcceptChangesDuringFill 确定填充数据后是否调用AcceptChanges。true为调用,默认为true。
AcceptChangesDuringUpdate 确定更新数据是否调用AcceptChanges。true为调用,默认为true。
ContinueUpdateOnError 确定在更新过程中遇到错误时是否生成异常。
DeleteCommand 用于从数据集中删除记录的SqlCommand对象。
InsertCommand 用于从数据集中插入记录的SqlCommand对象。
UpdateCommand 用于从数据集中更新记录的SqlCommand对象。
SelectCommand 用于从MSSQL查询记录的SqlCommand对象。
FillLoadOption 确定SqlDataAdapter对象如何从DbDataReader中填充DataTable。
TableMappings 提供源表和Datatable之间的主映射。
UpdateBatchSize 确定每次到服务器的往返过程中处理的行数。

2. SqlDataAdapter类的常用方法

方法 描述
Dispose 释放DataAdapter对象。
Fill 用于填充DataSet对象。
FillSchema 向指定的DataSet对象中填充表架构信息。
Update 将DataSet对象中的数据修改更新实际的数据库。

具体步骤如下:

(1) 创建SqlDataAdapter对象(如myDataAdapter)
  • 1)myDataAdapter = new SqlDataAdapter();
  • 2)myDataAdapter = new SqlDataAdapter(SqlCommand);
  • 3)myDataAdapter = new SqlDataAdapter(String SelectCommand, SqlConnection);
  • 4)myDataAdapter = new SqlDataAdapter(String SelectCommand, String string);
(2) 创建SqlCommand对象(如command)
  • myDataAdapter.SelectCommand = command;
  • myDataAdapter.InsertCommand = command;
  • myDataAdapter.UpdateCommand = command;
  • myDataAdapter.DeleteCommand = command;
(3) 更新数据库:Update()

Update方法的具体是由步骤如下:

a. 创建DataSet对象(如myDataSet);
b. 创建SqlCommandBuilder对象:
SqlCommandBuilder builder = new SqlCommandBuilder(myDataAdapter);
c. 将DataSet的数据填充到DataAdapter:myDataAdapter.Fill(myData);
d. 更改DataSet数据表中的内容;
e. myDataAdapter.Update(myDataSet, "某一数据源表名");

(4) 释放DataAdapter:Dispose()

myDataAdapter.Dispose();

六. 使用DataReader对象读取数据

DataReader对象是一个简单的数据集,用于从数据源中检索只读数据集,常用语检索大量数据。对于连接Sql Server数据库,则使用SqlDataReader。

使用DataReader读取数据的方法如下:

  • 1)创建数据库连接;
  • 2)打开数据库连接;
  • 3)创建Command对象;
  • 4)执行Command对象的ExcuteReader方法;
  • 5)读到DataReader对象内容并绑定到数据控件中;
  • 6)关闭DataReader对象;
  • 7)关闭连接;

读取Reader对象的方法如下:

1)确定一个循环While(reader.Read());

2)在循环体中用如下方法读取:

  • a). 用reader列名索引器,如reader["ID"];
  • b). 使用序数索引器,如reader[0];
  • c). 若已知要读取数据的数据类型用GetType("序数索引"),如reader.GetString(1);

备注:方法c最快,方法b次之,方法a最慢。

本文作者:子匠_Zijor,转载请注明出处:http://www.dengzhr.com/others/backend/csharp/602