![](/img/trans.png)
[英]how to use WebAPI by creating an instance of it like ASMX web service
[英]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();
//}
}
}
}
}
}
通常最好在變量使用點附近聲明變量。 由於除了在web方法中沒有使用這些變量之外,我將它們全部移入了內部。 我把琴弦常數留在外面。
SqlConnection
, SqlCommand
和SqlTransaction
都需要在using
塊中,以確保它們使用的任何資源都將在該塊結束后被清除,無論是否引發異常。 對於實現IDisposable
接口的類,當您創建它們,使用它們並最終在相同的代碼范圍內全部使用它們時,這是正確的。
另一個using塊,但更重要的是,我將參數用作最佳實踐。 您不應該通過字符串串聯來構建SQL查詢,因為它允許您的調用者(或您的用戶)決定將要執行的查詢的文本。 這樣可以防止“ SQL注入攻擊”。
另一個using
塊。 SqlTransaction
由BeginTransaction
方法創建。
這是代碼中最嚴重的問題。 永遠不要忽略異常。 至少要確保將異常記錄在以后可以閱讀的地方。
對於此示例,我按照您返回字符串的做法進行了操作,但是我將完整的異常添加到了字符串的末尾。 不漂亮,但是所有信息都在那里。
因為conn
在using
塊中,所以finally
不需要顯式的。 using
塊等效於try/catch/finally
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.