C# 如何在ASMX Web服务中使用事务?
我开始在Web服务中使用事务。我使用C#并以事务开始插入。 但我不插入数据库 编码WebService.csC# 如何在ASMX Web服务中使用事务?,c#,asp.net,web-services,transactions,asmx,C#,Asp.net,Web Services,Transactions,Asmx,我开始在Web服务中使用事务。我使用C#并以事务开始插入。 但我不插入数据库 编码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.o
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();
}
}
}
Code Default.aspx.cx(网站)
但现在的结果是“事务失败…”
我希望结果“交易完成”并插入到数据库完成
代码的主要问题是忽略了异常。永远不要忽略例外情况。他们通常会告诉你代码有什么问题 您的代码还有几个其他问题,我将用以下更正的代码解释:
[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();
//}
}
}
}
}
}
SqlConnection
、SqlCommand
和SqlTransaction
都需要在using
块中,以确保无论是否引发异常,它们使用的任何资源都将随着块的完成而被清除。对于实现IDisposable
接口的类来说,这是正确的,当您在相同的代码范围内创建、使用和完成这些接口时使用
块。SqlTransaction
是通过BeginTransaction
方法创建的conn
位于using
块中,因此不需要显式finally
。使用块的相当于try/catch/finally
完整的异常信息在哪里?我认为您在事务处理方面没有问题,但在SQL查询方面没有问题。请记录您的异常,目前您正在忽略捕获的异常。这将告诉您查询出了什么问题。ASMX是一种遗留技术,不应用于新的开发。WCF或ASP.NET Web API应用于Web服务客户端和服务器的所有新开发。一个提示:微软已经在MSDN上退出了。
[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();
//}
}
}
}
}
}