引言
ADO.NET 是微软在.NET Framework 中负责数据访问的类库集,可以进行数据库的访问和操作。
ADO.NET 是一种数据访问技术,使得应用程序能够连接到数据存储,并以各种方式操作存储在里面的数据。
ADO.NET 主要有五大对象:
- Connection(连接数据库)
- Command(执行T-SQL语句)
- DateReader(读取数据库,一种只读模式,只能向前)
- DataAdapter(用户填充DataSet,断开模式)
- DataSet&DataTable(数据集,好比电脑的内存)
五大类
Connection
建立与特定数据源的连接,所有Connection对象的基类均为DbConnection类,是所有数据库操作的基础,在操作数据库之前要先建立数据连接。
Connection主要分为四个子类:
- SqlConnection 命名空间:System.Data.SqlClient,用于Sql Server数据库
- OleDbConnection 命名空间:System.Data.OleDb,连接支持OLE DB的数据库
- OdbcConnection 命名空间:System.Data.Odbc,连接任何支持ODBC的数据库
- OracleConnection 命名空间:System.Data.OracleClient,连接Oracle
- 实例说明(仅以的
SqlConnection(Sql Server)为例)
string connectionString = "Server=.;User Id=user;Pwd=passwold;DataBase=data;Persist Security Info=True;"; //数据库连接字符串
SqlConnection connection = new SqlConnection(connectionString); //创建SqlConnection实例
connection.Open(); //打开数据库连接
connection.Close(); //关闭连接
- 创建Connection连接的时候,千万要记得关闭,建议使用using,这样可以确保退出代码块时自动关闭
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
}
Command
主要用来对数据库发出一些指令(查询、新增、修改、删除、存储过程等),以及呼叫在数据库中的预存程序。所有 Command 对象的基类均为 DbCommand 类
Command对象有三个主要的方法:
- ExecuteNonQuery 执行一个SQL语句,返回受影响的行数。主要用来执行增加、删除、更新操作
- ExecuteReader 执行一个查询的SQL语句,返回一个DataReader对象
- ExecuteScalar 从数据库中检索单个值,主要用于统计操作
DataReader
DataReader对象不能使用new关键字实例化,只能使用ExecuteReader()方法返回。
DataReader是一个读取行的只读流的方式,绑定数据时比使用数据集方式性能更高,因为它是只读。
DataReader对象读取数据时要与数据库保持连接,读取完后,通过Close关闭。
所有 DataReader 对象的基类均为 DbDataReader 类。
SqlDataReader reader = new SqlDataReader(CommandBehavior.CloseConnection); //CommandBehavior.CloseConnection 在关闭Reader的同时关闭connection
DataAdapter
DataAdapter 也被称之为数据适配器对象,DataAdapter 利用 Connection 对象连接的数据源,使用数据库命令对象 Command 规定的操作从数据源中检索出数据,并将数据填充数据集对象 DataSet,或者将数据集中经过编辑后的数据送回数据源。
DataAdapter对象有两个主要方法:
- Fill 搭配SQL的 Select 指令,将数据从数据库中取出来,并填充进 DataSet 里面以供使用
- Update 将 DataSet 修正过的数据,回写入数据库中。PS:Insert、Update 的SQL指令都是通过该方法来处理
DataSet
驻留与内存中的数据库,内部用XML来描述数据。它可以包含任意多个数据表(DataTable),独立于各种数据源。
实例
数据库的操作大致分为两类:
- 对数据库查询,返回查询的数据
- 对数据哭进行增、删、改,不需要返回查询数据
查询
- Command 对象的 ExecuteScalar 方法,只返回结果集中的第一行第一列,并返回值为Object类型。ExecuteScalar 经常用于返回单一值时的情况。例如刚插入一行数据,想要立即知道它Id值。
static public int AddProductCategory(string newName, string connString)
{
int newProdID = 0;
string sql =
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
+ "SELECT CAST(scope_identity() AS int)";
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@Name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = newName;
try
{
conn.Open();
newProdID = (int)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return (int)newProdID;
}
- DataReader对象接收Command对象的ExecuteReader方法()的返回值,DataReader从数据库中检索只读、只进的数据流。
private static void ReadOrderData(string connectionString)
{
string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;";//sql语句
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}",reader[0], reader[1]));
}
}
finally
{
// 读完数据后,调用关闭
reader.Close();
}
}
}
- DataAdapter对象将查询到的数据填充到DataSet中
private void Button_Click(object sender, RoutedEventArgs e)
{
string conStr = "";//连接字符串
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();//打开连接
string sql = "";//sql语句
SqlDataAdapter sda = new SqlDataAdapter(sql,conn);//实例化SqlDataAdapter对象
DataSet ds = new DataSet();
sda.Fill(ds);//填充数据集
}
}
增、删、改
- 通过Command对象的 ExecuteNonQuery 方法执行UPDATE、INSERT、DELETE
private static void CreateCommand(string queryString,string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
}
- 通过DataSet来更数据库中的数据
static private DataSet UpdateDataSet(string connectionString)
{
DataSet dataSet = new DataSet(); //实例化数据集dataset
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open(); //打开连接
SqlDataAdapter adapter = new SqlDataAdapter(); //实例化SqlDataAdapter对象
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Fill(dataSet); //填充数据集dataset
dataSet.Tables[0].Rows[0][0] = 2; //修改数据
adapter.Update(dataSet); //更新dataset
}
return dataSet;
}