• 数据访问技术系列课程 笔记(2) ADO.NET 连接方式进行数据访问


    一)连接环境简介

    连接环境的特点:

    1连接环境是指用户在这种环境下始终保持与数据源的连接 

    优点:环境易于实施安全控制;同步问题易于控制 

    2数据实时性优于其他环境 

    3缺点 

    必须保持持续的网络连接;扩展性差 

     

    连接环境下的对象模型:

    1)XxxConnection

    建立与数据源的连接,如SqlConnection 用于建立与Microsoft SQL Server的连接,

    OleDbConnection用于建立与任何支持OLEDB 的数据源的连接

    2)XxxComand

    执行数据源的命令,如SqlCommand可以调用一个Microsoft SQL Server的存储过程,

    XxxCommand 对象的ExecuteReader 方法可以返回一个XxxDataReader 对象

    3)XxxDataReader

    以只读的、前向的方式,以流的形式读取数据,例如SqlDataReader 可以读取Microsoft SQL Server 中的数据 

    XxxDataReaderXxxCommand(通常是SELEC命令)的ExecuteReader方法返回 

    4)XxxXmlReader

    快速的,无缓存的,前向的方式读取XML数据

     

    二)连接到数据源

    2.1)定义连接:XxxConnection ,连接字符串用于对数据源的连接

    重要参数:

    Provider 连接所用的数据提供程序的种类

    Data Sourse  数据库名称

    Initial Catalog 要连接的数据库的名称

    Integrated Security :使用Windows验证的那个用户权限

    UserID/Password  :登录名 密码

    Persist Security Info :连接后是否传送安全信息

    2.2)打开和关闭连接

    Open()Close()Dispose()

     

    Demo

     

    1     privatevoid Form1_Load(object sender, EventArgs e)
    2     {
    3       con.ConnectionString ="server=.;database =login;uid =sa;pwd =sa ";
    4 //注册事件
    5        con.StateChange +=new StateChangeEventHandler(stateChang);
    6     }
    7 privatevoid stateChang(object sender, StateChangeEventArgs e)
    8 {
    9 this.txtState.Text ="Original State:"+ e.OriginalState.ToString() +"\nCurrentState :"+ e.CurrentState.ToString();
    10
    11 if (e.CurrentState == ConnectionState.Closed)
    12 {
    13 this.btnClose.Enabled =false;
    14 this.btnOpen.Enabled =true;
    15 }
    16 elseif (e.CurrentState == ConnectionState.Open)
    17 {
    18 this.btnClose.Enabled =true;
    19 this.btnOpen.Enabled =false;
    20 }
    21 }
    22
    23 privatevoid btnOpen_Click(object sender, EventArgs e)
    24 {
    25 try
    26 {
    27 con.Open();
    28 }
    29 catch (Exception ex)
    30 {
    31 MessageBox.Show(ex.Message);
    32 }
    33 }
    34
    35 privatevoid btnClose_Click(object sender, EventArgs e)
    36 {
    37 try
    38 {
    39 con.Close();
    40 }
    41 catch (Exception ex)
    42 {
    43 MessageBox.Show(ex.Message);
    44 }
    45 }

    SQL Server Profiler 或者活动监视器查看连接

    参考:http://www.connectionstrings.com

     

    三)创建命令

    3.1)Command对象

    Command对象是一个SQL语句或者存储过程的引用

    Command可以直接被执行

    属性:NameConnectionCommandType(值为DirectTable表示输出一个单一的表,不常用)、CommandTextParameters

     

    3.2)Command 的重要方法

    ExcuteScalar :返回一个值

    ExecuteNonQuery:返回被影响的行数(除了Select语句)

    ExecuteReader:返回数据行的集合 

    ExecuteXmlReader:返回一个Xml的结果集,仅限于SqlCommand

     

    四)返回单个值

    ExcuteScalar 效率比ADO高,返回整个记录集

    1)使用ExecuteScalar()方法

    2)ADO.NET ADO效率更高,返回整个记录集

    3)示例 

      一个特定产品的库存数量

      有多少个产品

      使用COUNTMAXMINAVERAGE 

     

    五)返回数据行

    ExecuteReader ()   使用ExecuteReader 获取数据

    1Read方法 

    得到下一行 ,如果还有后续的数据行存在,返回true ,否则返回false 

    2)Item属性 

    Read["colunName"] 或者 read[columnPosition]

    3)GetXxx 方法 如:GetString GetInt32 (以基数零开始)

    4)GetValues 方法 

    一次返回所有的列(一个数组) 高效

    5)IsDbNull 方法

    用于测试是否返回NULL

    6Close方法

    Read方法返回False时,应该调用Close方法关闭DataReader ,释放连接

    DataReader 不关闭,连接不可以执行其它的Command, 因此要关闭。但是在 SQl Server 2005 :多活动结果集  在第一个DataReader 不关闭的情况下执行第二个DataReader 

     

    可空的的值类型: 

    int i = 0; 

    int ? j = 0;  //j 可以为空

    j.HasValue 

     

    返回多个结果集

    1)一个存储过程可能包含多条SQl语句 :将相关的任务分组,封装业务逻辑

    2)如果一个存储过程返回了多个结果集:调用nextResult方法移到下一个结果集

    3)判断有多少个数据行被一个存储过程影响: 使用RecordsAffected 属性

     

    DEMO

     

    privatevoid btnDataReader_Click(object sender, EventArgs e)
    {
    SqlConnection con
    =new SqlConnection("server =.;database=login;uid=sa;pwd=sa");
    SqlCommand cmd
    =new SqlCommand();
    cmd.CommandType
    = CommandType.Text;
    cmd.CommandText
    ="select id from tb_User;"+"select voteid from vote";
    cmd.Connection
    = con;
    cmd.Parameters.AddWithValue(
    "@ParameterName", "value");
    try
    {
    con.Open();
    SqlDataReader reader
    = cmd.ExecuteReader();
    do
    {
    while (reader.Read())
    {
    //一:利用可空类型:避免在数据库里面过滤
    int? i = reader.GetInt32(0);
    if (i.HasValue)
    {
    this.comboBox1.Items.Add(reader.GetInt32(0).ToString());
    }
    //二:IsDBNull过滤掉空值
    //if (!reader.IsDBNull(0))
    //{
    // this.comboBox1.Items.Add(reader.GetInt32(0).ToString());
    //}
    }
    }
    while (reader.NextResult());

    reader.Close();
    con.Close();
    this.comboBox1.SelectedIndex =0;
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }

     

    六)不返回值

    1ExecuteNonQuery 方法 

    2执行DDLDCL语句 

           – CREATE/ALTER/DROP 

           – GRANT/DENY/REVOKE 

    3执行其它DML语句 

           – INSERT/UPDATE/DELETE

     

    七)使用参数

    Command 命令行参数

    1)SQl语句和存储过程可以有输入输出参数以及返回值

    2)Command对象参数用来设置或者返回这些参数

    3)SqlParameterOleDbParameter

    4ParameterName

    参数的名称。例如:@CaId

    5)DbType 

    连接到数据库的类型,SQLType 和 OleDbType

    6)Direction 

    ParameterDirection枚举集合指定的值 ,包括:

    ParameterDirection.Input :输入

    ParameterDirection.InputOutput  :输入输出

    ParameterDirection..Output :输出

    ParameterDirection.ReturnValue :返回值

     

    .NET 里面

    默认:是输入参数

    输入输出:ref

    只是输出:out 

    在SQL里面 

    InputOutput Output 对应都是 Output  

    添加参数:

    cmd.Parameters.AddWithValue("@ParameterName","value");

    cmd.Parameters[0].Direction = ParameterDirection.InputOutput;

     

    八)实现事务

    8.1)事务是一列相互关联的操作,作为一个整体成功提交或失败(提交或回滚)

    8.2)ACID   

    Atomicity(原子)  :事务或者全部提交,或者全部不提交

    Consistency(一致) :事务保证了数据的完整性

    Isolation(分离)   :事务处理了数据操作的并发性 

    Durability(持续)  :记载事务结束后发生系统崩溃等灾难性情况,事务设计的数据操作也将正常保存。

    8.3)本地事务 :

    分布式事务 :MSDPC 用到数据库 文件系统 网络操作 ;也可以用到.NET内置的(WCF支持分布式事务)

    8.4)使用T-SQL实现事务

    BEGINTRANCOMMITTRANROLLBACKTRAN

    代码示例:

    BEGIN TRAN 

    DECLARE @orderDetailsError int, @productError int 

    DELETE FROM "Order Details" WHERE ProductID = 42

    SELECT @orderDetailsError = @@ERROR 

    DELETE FROM Products WHERE ProductID=42 

    SELECT @productError = @@ERROR 

    IF @orderDetailsError = 0 AND @productError = 0 

       COMMIT TRAN 

    ELSE 

    LLBACK TRAN 

     

    使用ADO.NET 管理事务

    1)XxxConnection 例如 :SqlConnection  BeginTransaction 

    2)XxxTransaction 例如 :SqlTransaction  Commit  RollBack 

    3)隔离事务

     

    SQL Server实现本地事务:

     

    privatevoid btnBgnTrn_Click(object sender, EventArgs e)
    {
    con
    =new SqlConnection("server =.;database=login;uid=sa;pwd=sa");
    //连接必须打开
    con.Open();
    //开始一个事务
    trn
    = con.BeginTransaction();
    SqlCommand cmd
    =new SqlCommand();
    //设置Command执行的事务:
    cmd.Transaction
    = trn;
    cmd.CommandType
    = CommandType.Text;
    cmd.CommandText
    ="select id from tb_User";
    cmd.Connection
    = con;
    cmd.ExecuteScalar();
    }

    privatevoid btnCommitTrn_Click(object sender, EventArgs e)
    {
    trn.Commit();
    con.Close();
    }

    privatevoid btnRollBackTrn_Click(object sender, EventArgs e)
    {
    trn.Rollback();
    con.Close();
    }
    }
    }
  • 相关阅读:
    C#应用NPOI实现导出EXcel表格中插入饼状图(可实现动态数据生成)
    Asp.Net开发学习知识点整理
    Javascript,闭包
    sublime 自定义快捷生成代码块
    $.extend()使用
    ztree 数据格式及其配置
    ztree 数据格式 及 基本用法
    表单中两个submit如何判断点击的是哪个submit
    myChart.on('finished')
    jQuery数组排序
  • 原文地址:https://www.cnblogs.com/lujiao_cs/p/2098785.html
Copyright © 2020-2023  润新知