为什么我需要一个局部变量来存储从 Ajax 到 WCF 方法的 SqlParameter 中的值

本文关键字:Ajax WCF 方法 SqlParameter 存储 局部变量 一个 为什么 | 更新日期: 2023-09-27 18:36:01

我目前正在使用 WCF 和 Jquery ajax 进行测试。我对 WCF 很陌生。无论如何,我有一个名为"ProductsService"的服务,它有四个从Jquery Ajax调用的参数。我遇到了一点问题,但谢天谢地,我解决了它。我的解决方案通过估计,所以任何人都可以向我解释为什么这个问题以这种方式解决?

这里是问题场景。

我将新产品从 Ajax 插入到 WCF 服务方法,该方法将参数存储在 SqlParameter 中。但是,只有一个SqlParameter具有值,其余SqlParameter为空。我稍微重组了我的方法,但仍然是一样的。然后我尝试添加局部变量以查看它是否会保存这些值并将它们存储到 SqlParameter 中。

这是方法

public void insertProdect(int categoryId, string name, string discrption, decimal price)
    {
        // for debuge
        int t1 = categoryId;
        String t2 = name;
        String t3 = discrption;
        decimal t4 = price;

        String sc = ConfigurationManager.ConnectionStrings["BDCS"].ConnectionString;
        using (SqlConnection con = new SqlConnection(sc))
        {
            //
            SqlCommand cmd = new SqlCommand("spInsertNewProductByCategoryId", con);
            cmd.CommandType = CommandType.StoredProcedure;
            //
            SqlParameter CategoryId = new SqlParameter();
            CategoryId.ParameterName = "@CategoryId";
            //CategoryId.Value = categoryId;
            CategoryId.Value = t1;
            //
            SqlParameter ProductName = new SqlParameter();
            ProductName.ParameterName = "@ProductName";
            //ProductName.Value = ProductName;
            ProductName.Value = t2;
            //
            SqlParameter ProductDescription = new SqlParameter();
            ProductDescription.ParameterName = "@ProductDescription";
            //ProductDescription.Value = ProductDescription;
            ProductDescription.Value = t3;
            //
            SqlParameter ProductPrice = new SqlParameter();
            ProductPrice.ParameterName = "@ProductPrice";
            //ProductPrice.Value = price;
            ProductPrice.Value = t4; 
            //
            cmd.Parameters.Add(CategoryId);
            cmd.Parameters.Add(ProductName);
            cmd.Parameters.Add(ProductDescription);
            cmd.Parameters.Add(ProductPrice);
            //
            con.Open(); 
            cmd.ExecuteNonQuery();
        }

阿贾克斯调用

     $(document).on("click", "#doInsertNewProduct", function () {
    $.when(
        $.ajax({
            url: "../ProductsService.svc/insertProdect",
            method: "post",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify({
                categoryId: $("#InsertCatogeryTextName").val(),
                name: $("#InsertProductTextName").val(),
                discrption: $("#InsertProductTextDiscrption").val(),
                price: $("#InsertProductTextPrice").val()
            }),
            success: function () {
                location.reload();
                console.log("Done! Successfully insert new Product");
            },
            error: function () {
                console.log("Error! unbale to insert new Product");
            }
        }));
});

谢谢大家

为什么我需要一个局部变量来存储从 Ajax 到 WCF 方法的 SqlParameter 中的值

您不需要局部变量 - 无论是单个SqlParameter还是值。您的代码将更简单,如下所示:

public void InsertProduct(int categoryId, string name, string description, decimal price)
{
    String sc = ConfigurationManager.ConnectionStrings["BDCS"].ConnectionString;
    using (SqlConnection con = new SqlConnection(sc))
    {
        con.Open(); 
        using (SqlCommand cmd = new SqlCommand("spInsertNewProductByCategoryId", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@CategoryId").Value = categoryId;
            cmd.Parameters.Add("@ProductName").Value = name;
            cmd.Parameters.Add("@ProductDescription").Value = description;
            cmd.Parameters.Add("@ProductPrice").Value = price;
            cmd.ExecuteNonQuery();
        }
    }
}

我强烈建议您也指定参数的类型,请注意,

例如
cmd.Parameters.Add("@CategoryId", SqlDbType.Int).Value = categoryId;