zoukankan      html  css  js  c++  java
  • ADO.NET

    一、ADO.NET简介

    ADO.NET是一种数据访问技术,使得应用程序可以连接到数据存储,并以各种方式操作存储在其中的数据。
     
    该技术基于.NET Framework,与.NET Framework类库的其余部分高度集成。ADO.NET API的设计,使得可以从所有面向.NET Framework的语言中使用该API,如Visual Basic、C#、J#、和Visual C++。ADO.NET软件栈包含两个主要部分:提供者和服务。
    ADO.NET的“提供者”是一些组件,这些组件知道如何与特定的数据存储设施交互(例如,有一个提供者与SQL Server交互,另一个提供者与Oracle数据库交互)。所有的提供者都向外提供一个统一的API接口,ADO.NET软件栈中的其他层在此API之上建立。
    ADO.NET还包括基于提供者而建立的一些服务,设计这些服务的目的,是为了方便编写应用程序。其中一个服务是内存中的缓存(in-memory cache),缓存保存了数据的关系形式,并执行修改跟踪和约束验证等功能;该服务通过ADO.NET DataSet接口提供,包括一些与提供者层进行交互的组件。
    五大对象分别是:
    1、Connection(连接数据库)
    2、Command(执行T-SQL语句)
    3、DataAdapter(用户填充DataSet,断开模式)
    4、DataReader(读取数据库,一种只读模式,只向前的)
    5、DataSet(数据集,好比电脑的内存)

    二、ADO.NET的组成

    ①System.Data  → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataTableMapping
    ②System.Data.Coummon     → 各种数据访问类的基类和接口
    ③System.Data.SqlClient   → 对Sql Server进行操作的数据访问类
      主要有:   a) SqlConnection            → 数据库连接器
                b) SqlCommand               → 数据库命名对象
                c) SqlCommandBuilder        → 生存SQL命令
                d) SqlDataReader            → 数据读取器
                e) SqlDataAdapter           → 数据适配器,填充DataSet
                f) SqlParameter             → 为存储过程定义参数
                g) SqlTransaction           → 数据库事物

    三、Connection连接对象

    Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接。所有Connection对象的基类都是DbConnection类。 

    3.1、连接字符串

    基本语法:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(Password)

    3.1.1、SQL Server连接字符串

    标准安全连接: 

    Data Source=.;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者

    Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Trusted_Connection=False;

    可信连接:

    Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;或者

    Server=myServerAddress;Database=myDatabase;Trusted_Connection=True; 

    3.1.2、Access连接字符串

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:myDatabase.mdb;User Id=admin;Password=;

    3.1.3、MySQL连接字符串

    Server=myServerAddress;Database=myDatabase;Uid=myUsername;Pwd=myPassword;

    3.1.4、DB2连接字符串

    Server=myAddress:myPortNumber;Database=myDatabase;UID=myUsername;PWD=myPassword;

    3.1.5、Oracle连接字符串

    Data Source=TORCL;User Id=myUsername;Password=myPassword; 

    3.2、连接到数据库

    Connection对象有两个重要属性: 

    (1)ConnectionString:表示用于打开 SQL Server 数据库的字符串; 
    (2)State:表示 Connection 的状态,有Closed和Open两种状态。 

    Connection对象有两个重要方法:

    (1)Open()方法:指示打开数据库;

    (2)Close()方法:指示关闭数据库。

    四、Command对象

    Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
    Command主要有三个方法: 

    4.1、ExecuteNonQuery

    ExecuteNonQuery():执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。用于完成insert,delete,update操作。

    4.2、ExecuteScalar ()

    ExecuteScalar ()从数据库检索单个值。这个方法主要用于统计操作。ExecuteScalar ()这个方法是针对SQL语句执行的结果是一行一列的结果集,这个方法只返回查询结果集的第一行第一列。

    executeScalar主要用于查询单行单列的值,如聚合函数(count,max,min,agv,sum)。

    4.3、ExecuteReader 获得数据

    ExecuteReader用于实现只进只读的高效数据查询。

    ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取一行之后,移动到另一行,则前一行就无法再用。有一点要注意的是执行之后,要等到手动去调用Read()方法之后,DataReader对象才会移动到结果集的第一行,同时此方法也返回一个Bool值,表明下一行是否可用,返回True则可用,返回False则到达结果集末尾。

    使用DataReader可以提高执行效率,有两种方式可以提高代码的性能:

    一种是基于序号的查找

    一个是使用适当的Get方法来查找。因为查询出来的结果一般都不会改变,除非再次改动查询语句,因此可以通过定位列的位置来查找记录。用这种方法有一个问题,就是可能知道一列的名称而不知道其所在的位置,这个问题的解决方案是通过调用DataReader 对象的GetOrdinal()方法,此方法接收一个列名并返回此列名所在的列号。

    五、综上写了一个DBherper帮助类示范代码:

    手写的DBHerper帮助类需要引入System.Data;和System.Data.SqlClient;俩个命名空间

     1 public static class DBHerper
     2     {
     3         //using 可以帮我们连接用完后会被自动释放连接,不用手动的去写Close();
     4         public static string strsql = "Server=192.168.1.18; Database=yourDatabase; User=sa;password=yourpassword";//连接数据库对象的字符串
     5         /// <summary>
     6         /// 返回查询结果受影响的行数
     7         /// </summary>
     8         /// <param name="sql">要执行的SQL语句</param>
     9         /// <param name="ps"></param>
    10         /// <returns></returns>
    11         public static int ExecuteNonQuery(string sql,params SqlParameter[] ps)
    12         {
    13             //数据库连接对象
    14             using(SqlConnection conn=new SqlConnection(strsql))
    15             {
    16                 //创建命令对象,指定要执行sql语句与连接对象conn
    17                 using (SqlCommand cmd=new SqlCommand(sql,conn))
    18                 {
    19                     //打开连接
    20                     conn.Open();
    21                     cmd.Parameters.AddRange(ps);
    22                     //执行,返回影响行数
    23                     return cmd.ExecuteNonQuery();
    24                 }
    25             }
    26         }
    27         /// <summary>
    28         /// 返回查询结果首行首列
    29         /// </summary>
    30         /// <param name="sql">要执行的SQL语句</param>
    31         /// <param name="ps"></param>
    32         /// <returns></returns>
    33         public static object ExecuteScalar(string sql, params SqlParameter[] ps)
    34         {
    35             //数据库连接对象
    36             using (SqlConnection conn = new SqlConnection(strsql))
    37             {
    38                 //创建命令对象,指定要执行sql语句与连接对象conn
    39                 using (SqlCommand cmd = new SqlCommand(sql, conn))
    40                 {
    41                     //打开连接
    42                     conn.Open();
    43                     cmd.Parameters.AddRange(ps);
    44                     //执行查询返回单行单列的值,Object类型
    45                     return cmd.ExecuteScalar();
    46                 }
    47             }
    48         }
    49         /// <summary>
    50         /// 获得一个DataTable表
    51         /// </summary>
    52         /// <param name="sql">要执行的SQL语句</param>
    53         /// <param name="ps">参数</param>
    54         /// <returns></returns>
    55         public static DataTable GetDataTable(string sql, params SqlParameter[] ps)
    56         {
    57             //数据库连接对象
    58             using (SqlConnection conn = new SqlConnection(strsql))
    59             {
    60                 using (SqlDataAdapter da = new SqlDataAdapter(sql, conn))
    61                 {
    62                     conn.Open();
    63                     da.SelectCommand.Parameters.AddRange(ps);
    64                     DataTable dt = new DataTable();
    65                     da.Fill(dt);
    66                     return dt;
    67                 }
    68             }
    69         }
    70         /// <summary>
    71         /// 
    72         /// </summary>
    73         /// <param name="sql">要执行的SQL语句</param>
    74         /// <param name="ps">参数</param>
    75         public static void SqlDataReader(string sql, params SqlParameter[] ps)
    76         {
    77             //数据库连接对象
    78             using (SqlConnection conn = new SqlConnection(strsql))
    79             {
    80                 using (SqlCommand cmd = new SqlCommand(sql, conn))
    81                 {
    82                     //执行查询返回结果集
    83                     SqlDataReader reader = cmd.ExecuteReader();
    84                     //下移游标,读取一行,如果没有数据了则返回false
    85                     while(reader.Read())
    86                     {
    87                         reader.GetString(1);
    88                     }
    89                 }
    90             }
    91         }
    92     }
    View Code
  • 相关阅读:
    VS2010 自动跳过代码现象
    Reverse Linked List II 【纠结逆序!!!】
    Intersection of Two Linked Lists
    Linked List Cycle II
    Remove Nth Node From End of List 【另一个技巧,指针的指针】
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Remove Duplicates from Sorted List
    Linked List Cycle
    Dungeon Game
  • 原文地址:https://www.cnblogs.com/hudean/p/11703339.html
Copyright © 2011-2022 走看看