簡體   English   中英

如何在ASMX Web服務中使用事務處理?

[英]How use Transaction within an ASMX Web Service?

我開始在Web服務中使用事務。 我使用C#並開始使用Transaction插入。 但是我不插入數據庫。

代碼WebService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;
using System.Data;

[WebService(Namespace = "example.org")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]

public class WebService : System.Web.Services.WebService 
{
    SqlConnection conn;
    SqlCommand comm1, comm2, comm3;
    SqlTransaction trans;
    SqlDataAdapter adapter1, adapter2;
    DataSet ds1, ds2;
    string constring = "Database=transaction;server=localhost;user=sa;password=toon2255";

    [WebMethod(Description = "Transaction")]
    public string transaction(int userid, int amount)
    {
        conn = new SqlConnection(constring);
        conn.Open();
        comm2 = new SqlCommand("INSERT INTO moneytrans VALUES('" + userid + "','" + amount + "')");
        trans = conn.BeginTransaction();
        comm2.Transaction = trans;
        try
        {
            comm2.ExecuteNonQuery();
            trans.Commit();
            return "Transaction Complted. ";
        }
        catch (Exception)
        {
            trans.Rollback();
            return "Transaction Failed..";
        }
        finally
        {
            conn.Close();
        }
    }
}

代碼Default.aspx.cx(網站)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

protected void btnok_Click(object sender, EventArgs e)
    {
        WSLogin.WebService obj = new WSLogin.WebService();
        lblmsg.Text = obj.transaction(Convert.ToInt32(txtuserid.Text), Convert.ToInt32(txtamount.Text));
    }

但是結果現在“交易失敗..”

我想要結果“交易強制”並插入數據庫完成。

代碼的主要問題是忽略了異常。 永遠不要忽略異常。 他們通常會告訴您代碼有什么問題。

您的代碼還有其他一些問題,我將用以下更正的代碼進行說明:

[WebService(Namespace = "example.org")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService : System.Web.Services.WebService
{
    // 1
    const string constring = "Database=transaction;server=localhost;user=sa;password=toon2255";

    [WebMethod(Description = "Transaction")]
    public string transaction(int userid, int amount)
    {
        // 2
        using (SqlConnection conn = new SqlConnection(constring))
        {
            conn.Open();
            // 3
            using (SqlCommand comm2 = new SqlCommand("INSERT INTO moneytrans VALUES(@userid,@amount)"))
            {
                comm2.Parameters.AddWithValue("@userid", userid);
                comm2.Parameters.AddWithValue("@amount", amount);

                // 4
                using (SqlTransaction trans = conn.BeginTransaction())
                {
                    comm2.Transaction = trans;
                    try
                    {
                        comm2.ExecuteNonQuery();
                        trans.Commit();
                        return "Transaction Completed. ";
                    }
                    // 5
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        // 6
                        return string.Format("Transaction Failed: {0}", ex);
                    }
                    // 7
                    //finally Not needed because of using block
                    //{
                    //    conn.Close();
                    //}
                }
            }
        }
    }
}
  1. 通常最好在變量使用點附近聲明變量。 由於除了在web方法中沒有使用這些變量之外,我將它們全部移入了內部。 我把琴弦常數留在外面。

  2. SqlConnectionSqlCommandSqlTransaction都需要在using塊中,以確保它們使用的任何資源都將在該塊結束后被清除,無論是否引發異常。 對於實現IDisposable接口的類,當您創建它們,使用它們並最終在相同的代碼范圍內全部使用它們時,這是正確的。

  3. 另一個using塊,但更重要的是,我將參數用作最佳實踐。 您不應該通過字符串串聯來構建SQL查詢,因為它允許您的調用者(或您的用戶)決定將要執行的查詢的文本。 這樣可以防止“ SQL注入攻擊”。

  4. 另一個using塊。 SqlTransactionBeginTransaction方法創建。

  5. 這是代碼中最嚴重的問題。 永遠不要忽略異常。 至少要確保將異常記錄在以后可以閱讀的地方。

  6. 對於此示例,我按照您返回字符串的做法進行了操作,但是我將完整的異常添加到了字符串的末尾。 不漂亮,但是所有信息都在那里。

  7. 因為connusing塊中,所以finally不需要顯式的。 using塊等效於try/catch/finally

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM