簡單的轉賬Tran 事務例子

來源:互聯網
上載者:User

 

--建立表  
IF(object_id('TranMoney') IS NOT  NULL)
DROP  TABLE  TranMoney

CREATE  TABLE  TranMoney
(
  ID NVARCHAR(50) NOT NULL,
  T_Money  MONEY  NOT NULL
)

GO

INSERT INTO TranMoney VALUES('001001',2000),('001002',2000)--sql 2008 新文法  

GO

IF(EXISTS(SELECT * FROM sys.objects WHERE name='pro_Turn_paragraph'))
DROP PROC  pro_Turn_paragraph
go
---建立  轉款    儲存     過程        
CREATE  PROC pro_Turn_paragraph(@From_ID NVARCHAR(50), @To_ID NVARCHAR(50),@TranMoney Money)
AS

BEGIN TRAN  --

DECLARE  @ErrorCount INT; --錯誤  數  

SET @ErrorCount=0;

UPDATE TranMoney SET T_Money=T_Money+@TranMoney WHERE  ID=@To_ID;

SET  @ErrorCount+=@@ERROR;

UPDATE TranMoney SET  T_Money=T_Money-@TranMoney WHERE  Id=@From_ID;

SET @ErrorCount+=@@ERROR;

IF @ErrorCount<>0

 BEGIN  ROLLBACK  TRAN 
 
   
 RETURN  0;
 END

ELSE

BEGIN  COMMIT TRAN

RETURN 1;

END

go

EXEC pro_Turn_paragraph  '001001' ,'001002',45

 

/***

接下來看看C#.net 是如何調用這個預存程序的:

    protected void Button1_Click(object sender, EventArgs e)

    {

        SqlConnection con =new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");
//連接字串

        SqlCommand cmd = new SqlCommand("pro_Turn_paragraph",con); //調用預存程序

        cmd.CommandType = CommandType.StoredProcedure;

        con.Open();

        SqlParameter prar = new SqlParameter();//傳遞參數

        cmd.Parameters.AddWithValue("@from_ID", 1);

        cmd.Parameters.AddWithValue("@To_ID", 2);

        cmd.Parameters.AddWithValue("@TranMoney",Convert.ToInt32( TextBox1.Text) );

 

        cmd.Parameters.Add("@return", "").Direction = ParameterDirection.ReturnValue;//擷取預存程序的傳回值

        cmd.ExecuteNonQuery();

        string value = cmd.Parameters["@return"].Value.ToString();//把傳回值賦值給value

        if (value == "1")

        {

            Label1.Text = "添加成功";

        }

        else

        {

            Label1.Text = "添加失敗";

       }

}

這個也就是在預存程序裡添加事務,再來看看不在資料庫寫sql預存程序,ADO.NET是如何處理事務的:

protected void Button2_Click(object sender, EventArgs e)

    {

        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");

        con.Open();

        SqlTransaction tran = con.BeginTransaction();//先執行個體SqlTransaction類,使用這個事務使用的是con 這個串連,使用BeginTransaction這個方法來開始執行這個事務

        SqlCommand cmd = new SqlCommand();

        cmd.Connection = con;

        cmd.Transaction = tran;

        try

        {

             //在try{} 塊裡執行sqlcommand命令,

            cmd.CommandText = "update TranMoney set T_Money=T_Money-'" + Convert.ToInt32(TextBox1.Text)
+ "' where ID='001001'";

            cmd.ExecuteNonQuery();

            cmd.CommandText = "update TranMoney set T_Money=T_Money+"+Convert.ToInt32(TextBox1.Text)+"
where ID='001002'";

            cmd.ExecuteNonQuery();

            tran.Commit();//如果兩個sql命令都執行成功,則執行commit這個方法,執行這些操作

 

            Label1.Text = "添加成功";

        }

        catch

        {

            Label1.Text = "添加失敗";

            tran.Rollback();//如何執行不成功,發生異常,則執行rollback方法,復原到事務操作開始之前;

        }

 

    }  ******/

這就是兩個事務不同用法的簡單例子,ADO.NET 交易處理的方法看起來比較簡單,但是他要使用同一個串連來執行這些操作,要是同時使用幾個資料庫來用一個事務執行,這樣就比較繁瑣,但是要是用sql預存程序,這樣就相對比較簡單,總之是兩種方法各有各的優點

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.