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

Posted

技术标签:

【中文标题】为啥我需要一个局部变量来将 SqlParameter 中的值从 Ajax 存储到 WCF 方法【英文标题】:Why I need a local variables to store value in SqlParameter from Ajax to WCF method为什么我需要一个局部变量来将 SqlParameter 中的值从 Ajax 存储到 WCF 方法 【发布时间】:2016-06-06 09:55:40 【问题描述】:

我目前正在使用 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();

        

ajax 调用

     $(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");
            
        ));

);

谢谢大家

【问题讨论】:

你不需要本地变量。不幸的是,由于我们看不到没有工作的代码,我们无法告诉为什么它没有工作...... ProductName.Value = name 而不是 ProductName.Value = ProductName 应该可以工作。同样适用于ProductDescription.Value = discrption 而不是ProductDescription.Value = ProductDescription; 【参考方案1】:

为此,您不需要局部变量 - 无论是单个 SqlParameters 还是值。您的代码会更简单:

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;

【讨论】:

以上是关于为啥我需要一个局部变量来将 SqlParameter 中的值从 Ajax 存储到 WCF 方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥局部变量在 Java 中是线程安全的

要同步哪些对象?为啥局部变量不好? [复制]

为啥我的线程函数中的局部变量会被其他线程中断?

为啥 alloca 与创建局部变量不同?

为啥在 Django 中使用线程局部变量不好?

为啥尚未定义的局部范围变量引用同名的实例变量?