zoukankan      html  css  js  c++  java
  • ADO.NET系列之事务和调用存储过程

         前几篇我们介绍了Connection、Command和DataAdapter等对象,本节我们将学习ADO.NET中不可缺少的事务,以及调用数据库的存储过程。

    ADO.NET事务

         在许多大型、关键的应用程序中,计算机每秒钟都在执行大量的任务。更为经常的不是这些任务本身,而是将这些任务结合在一起完成一个业务要求,称为事务。如果能成功地执行一个任务,而在第二个或第三个相关的任务中出现错误,将会发生什么?这个错误很可能使系统处于不一致状态。这时事务变得非常重要,它能使系统摆脱这种不一致的状态。

         一个Command对象的CommandText属性指定多条以;分割的语句。这种情况下若没有事务,所有的语句都会被执行,若其中有语句出错,就导致了数据的不一致性。当然我们也可以写存储过程,在SQLServer的数据库系统内建存储过程的语句若没有事务,多条语句中的部分语句失效,一样导致数据的不一致性:你可以在存储过程内部Try/Catch/BeginTransaction等。

         事务是一个最小的工作单元,不论成功与否都作为一个整体进行工作。详情可参考:http://www.cnblogs.com/windows/articles/1605638.html

         下面我们做个示例展示事务在ADO.NET中的使用方法。

     string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    con.Open();
                    using (SqlTransaction tran = con.BeginTransaction())
                    {
                        using (SqlCommand com = con.CreateCommand())
                        {
                            try
                            {
                                com.Transaction = tran;
                                com.CommandText = "insert into table values('1','111')";
                                com.ExecuteNonQuery();
                                com.CommandText = "insert into table values('2','222')";
                                com.ExecuteNonQuery();
                                tran.Commit();
                                Console.WriteLine("事务提交成功");
                            }
                            catch (SqlException ex)
                            {
                                tran.Rollback();
                                con.Close();
                                Console.WriteLine("事务提交失败:" + ex.Message);
                            }
                        }
    
                    }
    
                }

        Connection对象BeginTransaction启动事务,然后将事务赋值给Command对象的Transaction属性即挂接了事务。即使没有Commit 和Rollback,若执行中 错误,事务一样自动回滚,或者成功提交。

        BeginTransaction可以指定隔离级别。ReadXXX不会对数据库加锁,尽管在事务中,外部程序仍然可以读取数据;但若事务中有Update语句,将导致数据库锁,外部程序不能继续读取数据。

         尽量考虑在存储过程中使用事务,避免使用ADO的事务,因为ADO的事务可能导致数据库长时间处于锁定状态;而数据库内的存储过程中的事务往往不会长时间挂起事务。

    ADO.NET调用存储过程

         存储过程(Stored Procedure)是一组为了完成特定功能的T-SQL语句集合,经编译后存储在SQL Server服务器中,利用存储过程可以加速SQL语句的执行。

    在应用程序中,使用存储过程读取数据,能够提高应用程序的工作效率,简化数据库的管理和显示信息

      创建一个带有输入参数的存储过程:

    CREATE PROCEDURE GetUserPro
        @id INT 
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        SELECT * FROM dbo.eftest WHERE id=@id
    END
    GO

      ADO.NET中调用存储过程示例:

     string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    string sql = "GetUserPro";
                    SqlParameter para = new SqlParameter("@id", 1);
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        DataSet ds = new DataSet();
                        try
                        {
                            com.Parameters.Add(para);
                            con.Open();
                            com.CommandType = CommandType.StoredProcedure;
                            SqlDataAdapter adapter = new SqlDataAdapter(com);
                            adapter.Fill(ds);
                            foreach (DataRow s in ds.Tables[0].Rows)
                            {
                                Console.WriteLine("ID:" + s["id"].ToString());
                                Console.WriteLine("Name:" + s["name"].ToString());
                            }
                        }
                        catch (Exception ex)
                        { }
                    }
                }

        看过Command对象介绍的时候,代码跟那个差不多 ,是的  比Command章节的代码就多了一行:com.CommandType = CommandType.StoredProcedure; CommandType 默认情况是:com.CommandType = CommandType.Text;CommandType.StoredProcedure表示执行存储过程。

       

  • 相关阅读:
    怎样编写一个Photoshop滤镜(1)
    蜂窝状网格的定位方法
    【转载】[TC]飞船动画例子《C高级实用程序设计》
    【完全随笔】用户体验和设计
    在 WinCe 平台读写 ini 文件
    关于携带完整 alpha 通道图标的技术研究
    【转载】When should static_cast, dynamic_cast and reinterpret_cast be used?
    怎样编写一个Photoshop滤镜(3) Scripting Plugins
    配电网WebGIS研究与开发[5]
    配电网WebGIS研究与开发[4]
  • 原文地址:https://www.cnblogs.com/zyh000/p/10265762.html
Copyright © 2011-2022 走看看