ADO.NET 五大对象-周炜的博客

330 阅读4分钟
原文链接: blog.animebz.com

引言

ADO.NET 是微软在.NET Framework 中负责数据访问的类库集,可以进行数据库的访问和操作。
ADO.NET 是一种数据访问技术,使得应用程序能够连接到数据存储,并以各种方式操作存储在里面的数据。

ADO.NET 主要有五大对象:

  1. Connection(连接数据库)
  2. Command(执行T-SQL语句)
  3. DateReader(读取数据库,一种只读模式,只能向前)
  4. DataAdapter(用户填充DataSet,断开模式)
  5. DataSet&DataTable(数据集,好比电脑的内存)

五大类

Connection

建立与特定数据源的连接,所有Connection对象的基类均为DbConnection类,是所有数据库操作的基础,在操作数据库之前要先建立数据连接。

Connection主要分为四个子类:

  1. SqlConnection 命名空间:System.Data.SqlClient,用于Sql Server数据库
  2. OleDbConnection 命名空间:System.Data.OleDb,连接支持OLE DB的数据库
  3. OdbcConnection 命名空间:System.Data.Odbc,连接任何支持ODBC的数据库
  4. 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对象有三个主要的方法:

  1. ExecuteNonQuery 执行一个SQL语句,返回受影响的行数。主要用来执行增加、删除、更新操作
  2. ExecuteReader 执行一个查询的SQL语句,返回一个DataReader对象
  3. 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对象有两个主要方法:

  1. Fill 搭配SQL的 Select 指令,将数据从数据库中取出来,并填充进 DataSet 里面以供使用
  2. Update 将 DataSet 修正过的数据,回写入数据库中。PS:Insert、Update 的SQL指令都是通过该方法来处理

DataSet

驻留与内存中的数据库,内部用XML来描述数据。它可以包含任意多个数据表(DataTable),独立于各种数据源。

实例

数据库的操作大致分为两类:

  1. 对数据库查询,返回查询的数据
  2. 对数据哭进行增、删、改,不需要返回查询数据

查询

  • 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;
}