c#基础之ADO.NET(二)

时间:2021-10-25 15:09:19

 (一)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();

            }