1

我开始在 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();
        }
    }
}

代码 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));
    }

但现在结果“交易失败..”

我想要结果“事务完成”并插入数据库完成。

4

1 回答 1

0

您的代码的主要问题是您忽略了异常。永远不要忽略异常。他们通常会告诉您代码有什么问题。

您的代码还有其他几个问题,我将使用以下更正的代码进行解释:

[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. 和all 需要在块中SqlConnection,以确保它们使用的任何资源都将在块完成时被清理,无论是否引发异常。这对于实现接口的类来说是正确的,当您创建它们、使用它们并在相同的代码范围内完成使用它们时。SqlCommandSqlTransactionusingIDisposable

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

  4. 另一个using街区。由方法SqlTransaction创建BeginTransaction

  5. 这是您的代码最严重的问题。永远不要忽略异常。至少,一定要把异常记录在以后可以阅读的地方。

  6. 对于此示例,我遵循了您返回字符串的做法,但我将完整的异常添加到了字符串的末尾。不漂亮,但所有信息都会在那里。

  7. 因为conn是在一个using块中,所以finally不需要显式。一个using块相当于一个try/catch/finally

于 2013-10-15T19:50:05.703 回答