ADO.NET五大对象理论和实践(草稿)

一、ADO.NET五大对象理论

1、 Connection:与数据源建立连接。

2、 Command:对数据源执行SQL命令并返回结果。

  Command对象在执行的的时候有几个比较重要的方法,如ExecuteNonQuery方法,执行增删改命令。查询方法有2种:一个是ExecuteReader方法,返回一个DataReader对象。还有ExecuteScale方法,返回首行首列。

3、 DataReader:读取数据源的数据,只允许对将数据源以只读、顺向的方式查看其中所存储的数据。

  用于从数据源中检索只读数据集,并且必须有连接时才可以用。

4、 DataAdapter:数据适配器,对数据源执行操作并返回结果;

  在DataSet与数据源之间建立通信,将数据源中的数据写入DataSet中,或根据DataSet中的数据绑定数据源。

      DataAdapter使用中主要有4个命令对象比较重要。它们分别是:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand.

       SelectCommand,主要是从数据库中检索数据,InsertCommand、UpdateCommand、DeleteCommand这3个命令对象主要负责把本地数据集DataSet中的数据上传回服务器。

       DataAdapter的Fill方法,用于使用DataAdapter的SelectCommand的结果来填充DataSet。

5、 DataSet:内存中的数据库,是数据表的集合,它可以包含任意多个数据表。

   是ADO.NET的核心,相当于本地数据库,它与数据库无关的,它和远程数据库连接的桥梁就是.NET数据提供程序。它是由多个表构成,每个表都是一个DataTable对象。

    DataSet中主要的对象时DataTable,每一列都是DataColumn对象,每一行都是一个DataRow对象。在里面可以加入一些约束,一个是UniqueConstraint(唯一约束),一个是ForeignKeyConstraint(外键约束)。

    DataSet下面有两个重要的集合,一个是DataTables,一个是DataRelations.DataTables里面放置的都是DataTable对象。

关系图:

二、实践

  这里将对数据库的操作大致分为两类,一类是对数据库的查询,需要返回查询数据。一类是对数据库的增、删、改,不需要返回查询数据。下面就以这两类,结合实例说明。

查询:从上图中可以看到,想得到查询结果有三种方式:

  • 通过Command对象的ExecuteScalar方法(),但是这种方法只能返回由查询返回的结果集中的第一行的第一列,并且其返回值为object类型,其他列或行将被忽略。 ExecuteScalar()经常使用于当需要返回单一值时的情况。例如你刚插入一行数据,想要立即知道它的ID号,则可以使用ExecuteScalar()方法。通过MSDN给出的一个例子说明。
static public int AddProductCategory(string newName, string connString)
{
    Int32 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 = (Int32)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    return (int)newProdID;
}
  • 通过DataReader对象接收Command对象的ExecuteReader方法()的返回值,DataReader从数据库中检索只读、只进的数据流。 使用DataReader可以提高应用程序的性能,原因是它只要数据可用就立即检索数据,并且(默认情况下)一次只在内存中存储一行,减少了系统开销。下面是MSDN实例。
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 方法 (),可以使用 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;
}
原文地址:https://www.cnblogs.com/hao-1234-1234/p/6172203.html