C# 如何在ASMX Web服务中使用事务?

C# 如何在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

我开始在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.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();
                    //}
                }
            }
        }
    }
}
  • 通常最好在使用点附近声明变量。由于这些变量除了在web方法中使用外都没有使用,所以我将它们全部移到了内部。我让字符串在外面保持不变

  • SqlConnection
    SqlCommand
    SqlTransaction
    都需要在
    using
    块中,以确保无论是否引发异常,它们使用的任何资源都将随着块的完成而被清除。对于实现
    IDisposable
    接口的类来说,这是正确的,当您在相同的代码范围内创建、使用和完成这些接口时

  • 另一个使用块,但更重要的是,我使用参数作为最佳实践。您不应该通过字符串连接来构建SQL查询,因为它允许调用者(或用户)口述将要执行的查询的文本。这可以防止“SQL注入攻击”

  • 另一个
    使用
    块。
    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();
                        //}
                    }
                }
            }
        }
    }