从 AJAX JSON 提交到 SQL Server --> Web 方法

Posted

技术标签:

【中文标题】从 AJAX JSON 提交到 SQL Server --> Web 方法【英文标题】:Submit to SQL Server from AJAX JSON --> Web Method 【发布时间】:2020-07-31 17:16:57 【问题描述】:

我一直在研究一种解决方案,从通过 AJAX 提交到 WebMethod 的网页中获取数据,并最终进入数据库。一旦 AJAX Get 方法完成,我对如何处理 Web 方法代码块感到困惑。

这是我的 AJAX

function UpdatePeople() 
    var PeopleToUpdate = [
             "name": "John", "age": "17" ,
             "name": "Harry", "age": "19" ,
             "name": "Steve", "age": "23" 
        ];

    jQuery.ajax(
        url: '_ajax_updatepeople.aspx/UpdateOnDemand',
        type: "POST",
        data: JSON.stringify('PeopleToUpdate' : PeopleToUpdate ),
        dataType: "json"
    );

这是我的 Web 方法和公共类

[WebMethod]
public string UpdateOnDemand(List<People> PeopleToUpdate)

    // What do I do here ?????


public class People

    public string name  get; set; 

    public string age  get; set; 

如您所见,在我的 Web 方法中,我不知道如何访问这些 JSON 数据并对其进行处理。这是我尝试过的,它根本不起作用。我可以做些什么来纠正这个问题,还是我需要采取另一种方法?出现的错误(无论如何这可能不是唯一的错误)是无法从 Generic.List 转换为字符串(在动态内容的情况下......部分)

[WebMethod]
public string UpdateOnDemand(List<People> PeopleToUpdate)

    dynamic content = JsonConvert.DeserializeObject<People>(PeopleToUpdate);

    foreach (var Item in content)
    
        SqlConnection myConnection = null;
        SqlCommand sqlCmd = null;

        try
        
            myConnection = DBConnectConfig.openDBConnection();

            sqlCmd = new SqlCommand("Insert Into Users (Name, Age) VALUES (@Name, @Age)");
            sqlCmd.CommandType = System.Data.CommandType.Text;
            sqlCmd.Connection = myConnection;
            sqlCmd.Parameters.AddWithValue("@Name", Item.name);
            sqlCmd.Parameters.AddWithValue("Age", Item.age);
            sqlCmd.ExecuteNonQuery();

        
        finally
        
            DBConnectConfig.disposeDBObjects(myConnection, sqlCmd);
        
    

    return "People added to the database";

我是在正确的轨道上,还是根本没有?

【问题讨论】:

一方面,当涉及到 WebMethod 并转换为 List 时,您的 JSON 已经反序列化,因此您不需要这样做。你在哪一行得到错误? 感谢@KingOfArrows,现在根据马丁的以下帖子对这个错误进行了排序。控制台的错误似乎消失了,但似乎什么都没有发生。我的数据库没有更新,所以我想知道是否还有其他问题。我什至很难得到某种回报来表明可能是什么问题。 如果您安装了 Sql Server Management Studio,您可以打开 Sql Profiler,您可以看到在服务器上运行的 sql 命令。这样你就可以检查传入了哪些参数。还去掉 sqlCmd.Parameters.AddWithValue("@Name", Item.name); 行上的 @ 符号 【参考方案1】:

你在正确的轨道上。有几点要提

1) 不需要此行

dynamic content = JsonConvert.DeserializeObject<People>(PeopleToUpdate);

因为 ASP.NET 已经为您完成了从 JSON 字符串到类 People 的转换,所以方法 UpdateOnDemand(List&lt;People&gt; PeopleToUpdate) 已经具有反序列化模型。

2) 你可以遍历人的集合

foreach (var person in PeopleToUpdate)

3) 如果你的domain model 由多个类组成,它们之间有关系, 您可能会考虑为数据层使用 ORM,例如 Entity Framework。

4) 解决方案结构可以修改,项目结构示例

MySolution.Data(数据访问) MySolution.Business(对于业务组件,使用数据) MySolution.Web(使用 Business) MySolution.Data.Test(用于测试数据访问层的 xUnit/NUnit 项目)

业务组件示例

public class PeopleService: IPeopleService

    public PeopleService(/* inject settings with connection string */)
    
    

    public void UpdatePeople(List<People> people)
    
        var dal = new DALContext(.. connection string from settings);
        data.UpdatePeople(people);
    

DAL 组件:

public class DALContext

    // this method can be unit tested:
    public void UpdatePeople(List<People> people)
    
        .. code for database operations
    

【讨论】:

谢谢马丁,这肯定让我通过了出错的部分,我相信没有更多的错误。唯一的问题是我的数据库无法更新,实际上我似乎无法在此 Web 方法中设置中断来暂停以确保它按我预期的那样进行处理。我什至将 Response.Redirect 作为 Web 方法中的第一行,以至少查看 Web 方法是否正在运行,并且它甚至无法重定向。从查看代码 sn-ps 可以看出还有什么可以防止这种情况发生的吗? 为了解决与数据库操作有关的问题,可能有助于构建您的解决方案,将保存和从数据库加载的逻辑放入解决方案中的单独项目中。然后可以为这个新项目中的类创建单元测试(xUnit)。答案是一个例子。 一件小事,我们称为 UpdateOnDemand 的方法,它确实插入。 感谢您的帮助,马丁。我将尝试了解更多关于您所描述的内容,因为我尝试更新数据库的方式根本不起作用。我可以将它移到标准方法中,它工作得很好,但是当试图通过 ajax 调用更新相同的东西时它不起作用,我正在努力得到任何类型的响应来说明原因。

以上是关于从 AJAX JSON 提交到 SQL Server --> Web 方法的主要内容,如果未能解决你的问题,请参考以下文章

怎么在前端用ajax提交一个json数组到后台,后台怎么获得

ajax Form提交与Payload提交

ajax提交json数据到后端C#解析

Jquery Ajax 复杂json对象提交到WebService

使用AJAX请求json类型的列表数据从chart.js动态输出到气泡图中

如何通过ajax从表单发送POST数据数组?