美文网首页
C#数据库访问(一)

C#数据库访问(一)

作者: 有林带鱼卖吗 | 来源:发表于2018-10-31 21:45 被阅读0次

    ADO.NET数据库访问

    ado.net -> 微软研发
    

    访问数据源步骤:

    1.创建连接
    2.发出数据请求
    3.执行命令
    4.处理
    5.关闭连接


    发展阶段:

    1.ODBC(Open Database Connectivity)
    2.OLE DB(Object Linkig and Embedding Database)
    3.ADO(ActiveX Data Objects)
    4.ADO.NET


    ado.net可采用无连接方式访问和处理数据,只在必要时连接数据库,不使用时关闭连接。

    体系架构:数据提供程序+DataSet

    数据库和.net之间的体系架构
    数据提供程序(Data Provider)

    1.Connection 连接类:用来和数据源进行连接
    2.Command 命令类:用来从数据库中返回数据、修改数据或运行存储过程
    3.DataAdapter 数据适配器类:是数据源和数据集DateSet对象交换数据的桥梁,他是负责将数据库中的数据填充到DataSet对象中
    4.DataReader 数据读取器类:提供了对数据库的快速制度、前向访问功能

    数据集(DataSet)
    • 数据集 DataSet 可以理解为一个本地的小型数据库。即 ADO.NET 通过数据提供程序获得数据源的数据后,在客户机的内存中缓存的数据库,即内存中的数据库。
    • 数据集 DataSet 位于应用程序和数据源之间,这使得用户可以使用相同的方式,来操作从不同数据源取得的数据。
    • 数据集的缺点是要求高速缓存大量的数据。
    • DataSet 是 ADO.NET 的非连接(断开)结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,ADO.NET结构可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。

    1.什么是Data Provider

    Data Provider用于连接数据库执行命令检索结果。这些结果将被直接处理,或放置在 DataSet 中以便根据需要向用户公开、与多个源中的数据组合,或在层之间进行远程处理。.NET 的数据提供程序是轻量的,它在数据源和代码之间创建最小的分层,并在不降低功能性的情况下提高性能。

    Data Provider的四套内置的数据提供程序

    SQL Server.NET 数据提供程序 (System.Data.SqlClient 命名空间)

    提供一组对象来建立数据集的表和 SQL Server 数据库中的表之间的联系;
    SQL Server .NET 数据提供程序具有自己的一套访问 SQL Server 数据源的协议,对访问 SQL Server 数据库提供了特殊的优化,可以直接访问 SQL SERVER 而不需添加 OLEDB 或 ODBC,因此是轻量级的,效率更高。

    OLE DB.NET数据提供程序 (System.Data.OleDb 命名空间)

    用来建立与 OLE DB 数据源之间的连接;
    需借助 OLE DB 服务组件和数据库的 OLE DB 支持程序来访问数据库。由于需要通过一些中间层,因此在性能上有些损失;
    适用于所有提供了 OLE DB 接口的数据源。

    ODBC.NET数据提供程序 (System.Data.ODBC 命名空间)

    通过 ODBC 与数据源进行通信,适合于所有提供了 ODBC 接口的数据源。

    Oracle.NET 数据提供程序 (System.Data.OracleClient 命名空间)

    通过 Oracle 客户端与数据源进行通信;
    用于访问 Oracle 数据源。


    2.Data Provider的四个核心基类
    类名 说明
    DbConnection 类 表示道数据库的连接
    DbCommand 类 表示要对数据源执行的SQL语句或存储过程
    DbDataReader 类 继承DataAdapter的大部分功能
    DbDataAdapter 类 从数据源返回只读的、向前的数据
    3.核心类的作用、属性和方法
    (1)Connection类:
    • Connection 类用于建立到指定数据库的连接。
    • 任何对数据源的操作都需要建立一个连接对象。
    • Connection类的主要成员
    属性/方法 说明
    ConnectionString 连接字符串
    Open() 打开数据库连接
    Close() 关闭数据库连接
    • 不同命名空间的Connection类
    命名空间 对应的Connection类
    System.Data.Odbc OdbcConnection
    System.Data.OleDb OleDbConnection
    System.Data.SqlClient SqlConnection
    System.Data.OracleClient OracleConnection
    • 除了Connection类外,其他类的命名也相似
    (2)Command类
    • 在利用 Connection 类建立了到数据源的连接后,就可以利用 Command 对象对数据源执行 SQL 语句或存储过程。
    • 可以把 Command 对象看成是向 DataReader 对象返回数据结果流的工具。
    (3)DataReader类
    • DataReader 对象提供一种从数据库读取只进的行流的一种方式。它是读取单向只读数据的最快方法;
    • DataReader 对象一次只在内存中存储一个记录,所以内存资源负荷最小;什么记录?
    • 使用 DataReader 时,关联的 Connection 忙于服务 DataReader,除了关闭以外不能执行其他任何操作。所以,使用完DataReader 后,要注意尽快关闭它;
    (4)DataAdapter类
    • DataAdapter 对象用于从数据源中检索数据并填充 DataSet 中的表,完成无连接访问;
    • DataAdapter 还会把对 DataSet 作出的更改反馈回数据源;
    • 在 DataAdapter 的方法中,Fill() 和 update() 方法是用得最多的;

    3.Date Provider中其他重要的类
    • DbParameter类
      定义了命令和存储过程的输入、输出和返回值参数
    • ConnectionStringBuilder类
      提供一种用于创建和管理由 Connection 对象使用的连接字符串的内容的简单方法
    • CommandBuilder类
      自动生成 DataAdapter 的命令属性或从存储过程中派生参数信息

    ADO.NET两种访问方式

    有连接模式
    • 取得数据库连接之后,保持数据库连接,通过向数据库服务器发送SQL命令方式更新数据库
    • 特点:数据实时性好,同步问题易于控制,但是必须保持网络连接。
    • 主要使用的基本类包括:
      • Connection
      • Command
      • DataReader
    有链接模式下数据库访问步骤:
    • 通过Connection连接到数据库服务器;
      • 设置连接字符串等参数,打开连接;
    • 通过Command在数据库上执行SQL命令,如update,insert,delete,select
    • 如果只是查询操作,可以通过DataReader 读取数据
    • 关闭连接
    //使用命名空间
    using namespace System.data.OleDb;
    
        // (1)创建连接字符串
        string str = "server=" + textBox1.Text.Trim() + ";uid=" + textBox2.Text.Trim() + ";pwd=" + textBox3.Text.Trim() + ";database=study; Provider=SQLNCLI11;";
                       
        // (2)定义并初始化一个连接对象conn
        OleDbConnection conn = new OleDbConnection(str);
    
        // (3)定义并初始化一个命令对象cmd
        OleDbCommand cmd = new OleDbCommand("select * from student", conn);
    
        //(4)打开连接
        conn.Open();
    
        //(5)执行命令对象,并接收返回的值
    
        OleDbDataReader dataReader = cmd.ExecuteReader();
                                     
        // (6)绑定并显示数据
        BindingSource Bs = new BindingSource();
        Bs.DataSource = dataReader;
        dataGridView1.DataSource = Bs;
    
        //(7)关闭连接
        dataReader.Close();
        conn.Close();
    
    无连接模式(断开式访问模式)
    • 当需要对数据进行长时间处理时采用该模式,数据库服务器中数据在本地有一个副本,保存在中。
    • 特点:基于无连接的数据库访问,具有执行效率高、数据库连接占用时间短、修改记录易更改和回滚等优点,但是也在一定程度上导致了数据更新的不及时。
    • 主要使用的基本类:
      • Connection
      • Command
      • DataAdapter
        DataSet //有链接中没有用到
    • 方法:
      • DataAdapter取得数据,把数据放入本地内存DataSet中,断开与服务器的连接,所有修改都针对DataSet 进行,最后再通过DataAdapter更新回数据库。
    无连接模式下数据库访问步骤
    • 设置Connection连接字符串等参数;
    • 设置Command在数据库上要执行的SQL命令,如update,insert,delete,select;
    • 将以上两个类的参数传递给DataAdapter,由DataAdapter完成数据库连接和对数据库的操作;
    • DataAdapter把数据库fill到DataSet中;
    • 更改DataSet中的数据;
    • DataAdapter将更改提交到数据库,并自动关闭连接
        // (1)创建连接字符串
         string str = "server=" + textBox1.Text.Trim() + ";uid=" + textBox2.Text.Trim() + ";pwd=" + textBox3.Text.Trim() + ";database=study; Provider=SQLNCLI11;";
    
        // (2)定义并初始化一个连接对象conn
        OleDbConnection conn = new OleDbConnection(str);
    
        // (3)定义并初始化一个命令对象cmd
        OleDbCommand cmd = new OleDbCommand("select * from student", conn);
    
        // (4)定义并初始化一个数据适配器对象oda,DataAdapter对象会自动打开连接,自动关闭连接
        OleDbDataAdapter oda = new OleDbDataAdapter();
        // (5)为数据配器oda的SelectCommand属性赋值
        oda.SelectCommand = cmd;
        // (6)定义并初始化一个数据集对象ds
        DataSet ds = new DataSet();
        ds.Clear();
        // (7)数据适配器将取回的数据灌入数据集
        oda.Fill(ds, "student");
        // (8)显示数据
        dataGridView1.DataSource = ds.Tables["student"];
    

    Connection对象

    • ADO.NET强大的优势在于对不同的数据源提供一致的访问。.NET对不同数据源,使用不同的数据提供程序,这使得我们可以更高效的访问相应的数据源;
    • 其中,Connection对象肩负起连接数据源的重任。
    1.理解Connection对象
    • 对于ADO.NET而言,不同的数据源,都对应着不同的Connection对象。具体Connection对象如下表:
    名称 命名空间 描述
    SqlConnection System.Data.SqlClient 表示与SQL Server的连接对象
    OleDbConnection System.Data.OleDb 表示与OleDb数据源的连接对象
    OdbcConnection System.Data.Odbc 表示与ODBC数据源的连接对象
    OracleConnection System.Data.OracleClient 表示与Orale数据库的连接对象
    2.重要的属性
    • ConnectionString
      • 连接字符串,获取或设置用于打开连接的字符串
    • Database
      • 在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符中指定的数据库名
    • DataSource
      • 获取要连接的数据库服务器的名称
    • ConnectionTimeOut
      • 获取在建立连接时终止尝试并生成错误之前所等待的时间
    • State
      • 获取描述连接状态的字符串
    3.重要的方法
    • Open()
      • 使用 ConnectionString 所指定的设置打开数据库连接。
    • Dispose()
      • 释放连接使用的所有资源
    • Close()
      • 关闭与数据库的连接。 此方法是关闭任何已打开连接的首选方法。Close 方法回滚任何挂起的事务。 然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。
    4.ConnectionString属性
    • ConnectionString
      • 连接字符串,是一组被格式化的键值对:它告诉ADO.NET数据源在哪里,需要什么样的数据格式,提供什么样的访问信任级别以及其他任何包括连接的相关信息。
    (1) 语法格式
    • 连接字符串由一组元素组成,一个元素包含一个键值对,元素之间由“;”分开。
    • 语法如下:key1=value1;key2=value2;key3=value3...
    • 典型的元素(键值对)应当包含这些信息:
      • 数据源是基于文件的还是基于网络的数据库服务器,
      • 是否需要账号密码来访问数据源,
      • 超时的限制是多少,
      • 以及其他相关的配置信息。
    • 需要根据需要连接的数据源来确定键(key)是什么
    (2) 访问SQL Server连接字符串
    • ConnectionString构造时常用参数:
      • 服务器的名称或ip地址
      • 要使用的数据库名称
      • 如何通过数据库验证
      • 登录用户名和密码
      • 连接超时时间


        常用参数及说明
    (3)Connection的构建

    1.连接到本机数据库的连接字符串通常为
      string ConStr=“Server=(local);database=<数据名>;Integrated Security=sspi”
    

    例如:

      string ConStr=“Server=(local);database=study; Integrated Security=sspi”   //使用Windows身份验证
    

      string ConStr=“Server=(local);database=study; Integrated Security=false; uid=<登录名>;pwd=<密码>”                             //使用Sql server身份验证
    
    2.连接到远程数据库连接字符串通常为
      string ConStr=“Server=<IP>;database=<数据库名>; Integrated Security=false;uid=<登录名>;pwd=<密码>”
    

    在远程情况不能使用Integrated Security=sspi,因为本地当前的Windows帐户很可能在远程机上没有被其SQL Server授权。

    3.访问Access连接字符串
    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\mydatabase.mdb;User Id=admin;Password=;
    
    4.访问MySQL连接字符串
    Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
    
    5.如何构建连接字符串
    • 连接字符串本质上就是一个字符串,因此可以用
    string connStr = "Data Source=myServerAddress;\
    Initial Catalog=myDataBase;\
    User ID=myUsername;\
    Password=myPassword";
    

    • DbConnectionStringBuilder类
      • DbConnectionStringBuilder类为强类型连接字符串生成基类。之所以要有这样一个类,是因为它更加安全与友好。
    • 以SQL Server为例,可以这样构建一个连接字符串:
    SqlClient.SqlConnectionStringBuilder builder =� new SqlClient.SqlConnectionStringBuilder();�builder.DataSource = @"(local)\SQLEXPRESS";�builder.InitialCatalog = "myDataBase";�builder.IntegratedSecurity = true;
    
    

    (4) ConnectionState属性
    • State属性描述了与数据源的连接的当前状态。ConnectionState是一个枚举类型。它包括以下成员:
      • Closed: 连接处于关闭状态。
      • Open: 连接处于打开状态。
      • Connecting: 连接对象正在数据源连接。
      • Executing: 连接对象正在执行命令。
      • Fetching: 连接对象正在检索数据。
      • Broken: 与数据源的连接中断。
    (5)连接对象的关闭

    Close 方法:用于关闭一个连接,可以再调用 Open 方法打开连接,不会产生错误;
    Dispose 方法:不仅关闭一个连接,还清理连接所占用的资源。不可以再次直接用 Open 方法打开连接,必须再次重新初始化连接后才能再打开。

    (6)Connection对象的使用步骤

    以SQL数据提供程序为例:

    • 构造SqlConnection的对象;
    • 指定连接字符串,设置其他参数;
    • 调用Open();
    • 操作完毕,调用Close();
    String connString=“…..”
    SqlConnection conn=new SqlConnection(connString);
    Conn.Open();
    ...
    Conn.Close();
    
    (7)编写优雅而又安全的代码
    • 添加Ttry...catch块
      连接数据库时,可能出现异常,因此需要添加异常处理。对于C#来说,典型的异常处理是添加try...catch代码块。
      finally是可选的。finally是指无论代码是否出现异常都会执行的代码块。而对数据库连接资源来说,是非常宝贵的。因此,应当确保打开连接后,无论是否出现异常,都应该关闭连接和释放资源。所以,必须在finally语句块中调用Close方法关闭数据库连接。
    SqlConnection conn = new SqlConnection(connStr);
    try 
    {
        conn.Open();
    }
    catch(Exception ex)
    {
        ;//todo
    }
    finally
    {
        conn.Close();
    }
    
    

    相关文章

      网友评论

          本文标题:C#数据库访问(一)

          本文链接:https://www.haomeiwen.com/subject/nbuztqtx.html