ADO.NET来源于COM组件库ADO(即ActiveX Data Objects),利用 .NET Data Provider (数据提供程序)进行数据库的连接和访问,通过ADO.NET,数据库程序能够使用各种对象来访问符合条件的数据库内容。
ADO.NET是一个类库,这些类提供了很多的对象,可用于完成数据库的增删改查(CRUD)。包括的对象为:
上述五中对象提供了两种对数据库的访问方式:
ADO.NET访问数据库操作示意图如下:
使用ADO.NET在线访问数据库的步骤
连接数据库:
using System.Data.SqlClient;
string source = "server=(local); integrated security=SSPI; database=myDateabase; User ID=sa; pwd=sa";
SqlConnection conn = new SqlConnection(source);
conn.Open();
// 对数据库数据进行操作
conn.Close();
System.Data.SqlClient
;ConfigurationStringSettings
类进行调用:<configuration>
<connectionStrings>
<add name="myDatabase" connectionString=" server=(local); integrated security=SSPI; database=myDateabase;User ID=sa;pwd=sa" providerName="System.Data.SqlClient" />
connectionStrings>
configuration>
System.Configuration
”,然后定义数据库连接字符串为:string connstring = ConfigurationManager.ConnectionStrings["myDatabase"].ConnectionString;
创建Connecton对象:
string conn = new SqlConnection(connString);
打开数据库:conn.Open()
;
一般情况下,当在.NET中使用“稀缺”的资源时,如数据库连接、窗口或图形对象,最好确保每个资源在使用完毕后立即关闭。尽管.NET的设计人员实现了自动垃圾收集机制,垃圾最终会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。 当编写访问数据库的代码时,因为使连接打开的时间略长于需要的时间,就可能影响其他会话。在极端的情况下,不关闭连接可能会使其他用户无法进入一整组数据表,极大地降低应用程序的性能。主要有两种方式可以确保数据库连接等类似的“稀缺”资源在使用完后立即释放。
try...catch...finally
语句块 确保在finally中关闭任何已打开的连接;try
{
// open the connection
conn.Open();
// 对数据库数据进行操作
} catch (SqlException ex) {
// log the exception
} finally {
conn.Close();
}
using
语句块,无论块是如何退出的,using
子句都会确保关闭数据库连接using(SqlConnection conn = new SqlConnection(connstring)){
// Open the connection
conn.Open();
// 对数据库数据进行操作
}
创建数据库操作命令
Connection对象与数据源建立连接后,使用Command对象对数据源执行查询、插入、修改和删除等操作。
方法一:
SqlCommand command = new SqlCommand();
command.Connection = conn;
command.CommandText = "SQL语句";
方法二:
SqlCommand command = new SqlCommand("SQL语句", conn);
备注:
1). SQL查询语句若含有C#程序的变量并以字符串形式连接,则应注意数据为非数字的变量应用单引号括起来;
2). 在SQL查询语句中使用参数化查询语句的话,譬如:command.CommandText = "SELECT * FROM myTable WHERE siteName=@siteName";
为参数赋值时,需要使用Command对象建立参数对象,然后再赋值:
command.Parameters.Add(new SqlParameter(@siteName, siteName))
command.Parameters["@siteName"].Value = "http://#";
备注: 在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)方法。该方法简化了调用储存过程的输入参数过程,在运行时对所输入的数据类型进行判断,获取对应的数据库类型。 因此该方法在运行效率上比用 Add(string parameterName, SqlDbType sqlDbType, int size, string sourceColumn)方法要低。 在效率要求较高的地方仍然建议使用Add()方法,其它场合可以使用AddWithValue()简化代码编写量
执行sqlQuery命令
定义好命令后,就需要执行它。执行的语句有多种方式,这取决于要从命令中返回什么数据。Command类提供了下述可执行的命令:
ExecuteNonQuery()
—— 执行命令,但不返回任何结果。一般用于UPDATE、INSERT或DELETE语句中,其中唯一的返回值是受影响的记录个数。但如果调用带有输出参数的存储过程,该方法就有返回值。ExecuteReader()
—— 执行命令,返回一个类型化的IDataReader。是从数据源中选择某些数据的最简单快捷的方法对数据库操作完毕后关闭数据库连接:conn.Close();
DataAdapter对象主要在Connection对象和DataSet对象之间执行数据的传输工作,将数据填充到DataSet对象中,也可把DataSet对象更新后的数据返回到数据源中,也可架构在Command对象上,通过CommandBuilding对象生成DataAdapter的Insert、Update和Delete等SQL操作命令。使用DataSet和DataTable对象访问数据源后,ADO.NET会自动离线,在内存中处理数据,如有修改数据的操作,将自动重新连接数据源,更新数据库。DataSet对象、DataAdapter对象与数据源之间的关系如下:
DataSet <—> DataAdapter <—> 数据源
下面是使用DataAdapter进行离线数据库访问的操作步骤:
SqlAdapter da = new SqlAdapter("sqlQuery查询语句", conn);
DataSet ds = new DataSet();
da.Fill(ds, "TableName"); dt = ds.Tables["TableName"];
名称 | 属性/方法 | 说明 |
---|---|---|
Rows.Add() | 方法 | 插入新数据行 |
Rows[n].Delete() | 方法 | 删除第n行的记录 |
Rows.Count | 属性 | 获取行数 |
Rows[i][“ColumnName”] | 属性 | 获取第i行、列名为ColumnName的值 |
Rows[i][j] | 属性 | 获取第i行、第j列的值 |