• c#基础之ADO.NET(二)


     (一)ADO.NET事务 

        定义:所谓事务,可以看做是一个操作单元,是最小的操作单位,在这个事务中的操作,要么全部执行成功,要么全部失败。  

    在一个事务性操作的环境下,操作有着以下的4种特性,被称为ACID特性

    原子性(Atomicity) 当事务结束,它对所有资源状态的改变都被视为一个操作,这些操作要不同时成功,要不同时失败  
    一致性(Consistency) 操作完成后,所有数据必须符合业务规则,否则事务必须中止
    隔离性(Isolation) 事务以相互隔离的方式执行,事务以外的实体无法知道事务过程中的中间状态
    持久性(Durable)

    事务提交后,数据必须以一种持久性方式存储起来

    (1)参数化查询

    //(1)构造连接字符串:如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,如果integrated security=false,或者不写,表示一定要输入正确的数据库登录名和密码。sspi ,相当于 True,建议用这个代替 True。
                string connSQL = @"data source=服务器名称;initial catalog=数据库名称;persist security info=True;user id=用户名;password=密码;MultipleActiveResultSets=True";
                //(2)生成连接字符串.--可以省略如果不能省略,下面要这样写SqlConnection conn = new SqlConnection(connStr.ConnectionString)
                // SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder(connSQL);
    
                //(3)打开到数据库的连接 :SqlConnection表示一个到 SQL Server 数据库的打开的连接
                using (SqlConnection conn = new SqlConnection(connSQL))
                {
                    try
                    {
                        //(4)打开连接
                        conn.Open();
    
                        //(5)实例SqlTransaction类--查询不用开事务
                      //  SqlTransaction _tran = conn.BeginTransaction();
    
    
                        //(6)写一个sql命令,使用参数化命令--MenuID
                        StringBuilder strSQL = new StringBuilder();
                        strSQL.Append("select *  from  sys_menu   where  menuid>=@menuid  and ParaID!=@ParaID");
    
    
                        //(7)为事务创建一个命令,创建command命令
                        SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn);
    
                       // cmd.Transaction = _tran;
    
                        //构造Parameter对象
                        int mesnuid = 185;
                        int paraid = 0;
                        SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@menuid", mesnuid), new SqlParameter("@ParaID", paraid) };
                        cmd.Parameters.AddRange(paras);
    
                        //(8)开启事务
    
                        //       conn.BeginTransaction();
    
                        SqlDataReader reader = cmd.ExecuteReader();
    
                        while (reader.Read())
                        {
                            //FieldCount获取数据中的行数
                            for (int i = 0; i < reader.FieldCount; ++i)
                            {
                                //GetName指定列的名称,GetValue指定=列的值
                                Console.WriteLine("{0}:{1}", reader.GetName(i), reader.GetValue(i));
                            }
    
    
                        }
    
                        reader.Close();
    
    
    
                        Console.Read();
                    }
                    catch (Exception e)
                    {
    
                        //_tran.Rollback();
                    }

    (2)修改--包含事务

    ExcuteNonQuery---通常使用它来执行Update、Insert和Delete语句。

    该方法返回值意义如下:

      对于Update、Insert和Delete语句,返回值为该命令所影响的行数。

      对于所有其他类型的语句,返回值为-1。

     //(1)构造连接字符串:如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,如果integrated security=false,或者不写,
                //表示一定要输入正确的数据库登录名和密码。sspi ,相当于 True,建议用这个代替 True。
                  string connSQL = @"data source=.;initial catalog=测试;persist security info=True;user id=测试;password=测试;MultipleActiveResultSets=True";
                //(2)生成连接字符串.--可以省略如果不能省略,下面要这样写SqlConnection conn = new SqlConnection(connStr.ConnectionString)
                // SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder(connSQL);
    
    
    
       //(2)连接数据库
                using(SqlConnection conn=new SqlConnection(connSQL))
                {
                    //(3)开启--可以放到后面开始执行ExcuteNonQuery方法的时候开启连接。
                    conn.Open();
                  
    
                    //(4)创建Command命令
                    string sql = "update   sys_menu set iscount=@iscount  where  menuid=@menuid";
    
                    SqlCommand cmd = new SqlCommand(sql,conn);
    
                    //(5)参数化
                    int iscount=0;
                    int menuid=184;
    
                    SqlParameter[] para = new SqlParameter[] { new SqlParameter("@iscount", iscount), new SqlParameter("@menuid",menuid) };
    
                    cmd.Parameters.AddRange(para);
                    //(6)开启事务 
                    SqlTransaction _tran = conn.BeginTransaction();
                    cmd.Transaction = _tran;
                    try
                    {
                        int RecordsAffected = cmd.ExecuteNonQuery();
                         
                        _tran.Commit();
                    }
                    catch (Exception e)
                    {
                        _tran.Rollback();
                    
                    }
                    conn.Close();
                    conn.Dispose();
    
                }

    (3)异步

    使用 ADO.NET 2.0 的异步进程 ,  数据库连接字符串要添加 Asynchronous Processing=true

    如果执行多条命令连接字符串还要添加 MultipleActiveResultSets=true

     string connSQL = @"data source=测试服务器;initial catalog=测试库;persist security info=True;user id=用户名;password=密码;MultipleActiveResultSets=True;Asynchronous Processing=true";

      using(SqlConnection conn=new SqlConnection(connSQL))
                {
                    //(3)开启--可以放到后面开始执行ExcuteNonQuery方法的时候开启连接。
                    conn.Open();
                  
    
                    //(4)创建Command命令
                    string sql = "update   sys_menu set iscount=@iscount  where  menuid=@menuid";
                    StringBuilder strSQL = new StringBuilder();
    
                   
                    for (int i = 184; i <= 210; ++i)
                    {
                        strSQL.Append("update   sys_menu set iscount=0  where  menuid=");
                        strSQL.Append(i+";");
                     
                    }
    
    
                    SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn);
    
                 
                    //(6)开启事务 
                    SqlTransaction _tran = conn.BeginTransaction();
                    cmd.Transaction = _tran;
                    try
                    {
                        IAsyncResult pending = cmd.BeginExecuteNonQuery();
    
                        while (pending.IsCompleted == false)
                        { 
                            //异步未完成。可以在这里做其他操作。
                            for (int x = 0; x <= 10; x++)
                            {
                                Console.WriteLine(x*1);
                            
                            }
    
                               
                        }
                        Console.WriteLine("异步完成");
    
                    //    int RecordsAffected = cmd.ExecuteNonQuery();
                          
    
                        cmd.EndExecuteNonQuery(pending);
    
                        _tran.Commit();
                    }
                    catch (Exception e)
                    {
                        _tran.Rollback();
                    
                    }
                    conn.Close();
                    conn.Dispose();
    
                    Console.Read();
    
                }
     
  • 相关阅读:
    C#基本数据类型
    ASP.NET MVC 实现二级域名
    asp.net下通过泛解析和伪静态实现二级域名的实现方法
    Web Forms vs Web MVC
    WebForm页面生命周期及asp.net运行机制
    波函数坍缩
    whoami
    wstngfw中使用虚拟IP映射内网IP
    Thread-specific data(TSD)线程私有数据
    Libev库学习
  • 原文地址:https://www.cnblogs.com/anjingdian/p/10994465.html
Copyright © 2020-2023  润新知