获取 REST API 数据并使用 C# 将它们保存到 SQL 表中

Posted

技术标签:

【中文标题】获取 REST API 数据并使用 C# 将它们保存到 SQL 表中【英文标题】:Get rest API data and save them into SQL Table with C# 【发布时间】:2021-12-30 08:05:37 【问题描述】:

这就是我要找的。我需要从 rest api 获取数据并将其插入到我的 SQL 表中。 我已经在这里和谷歌上搜索了一个解决方案,但他们从来没有满足我的需求。我对编码很陌生,所以我很难理解所有步骤。

这是我目前所拥有的:

    我尝试调用 api(有效) 在 DataTable 中填充数据(不工作) 将它们插入到 SQL 表中

这是我的代码:

protected void btnAPI_OnClick(object sender, EventArgs e)
        
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072;

            using (WebClient client = new WebClient())
            
                client.Credentials = new NetworkCredential(username,password);
                string json = client.DownloadString("https://XXXX/XXXX001?view=expand");
                JObject jArray = JObject.Parse(json);
                var dt = JsonConvert.DeserializeAnonymousType(json, new  Content = default(DataTable)).Content; //On this point the code gets an error and it stops


                for (int i = 0; i < dt.Rows.Count; i++)
                
                    connection(); //This is my connection string. It works!
                    sqlConn.Open();
                    using (sqlConn)
                    
                        string qry = "INSERT INTO myTable VALUES(@name, @age, @date)";
                        connection();
                        sqlConn.Open();

                        using (SqlCommand cmd = new SqlCommand(qry, sqlConn))
                        
                            cmd.Parameters.AddWithValue("@name", dt.Rows[i]["name"].ToString());
                            cmd.Parameters.AddWithValue("@age", dt.Rows[i]["age"].ToString());
                            cmd.Parameters.AddWithValue("@date", dt.Rows[i]["date"].ToString());

                            cmd.ExecuteNonQuery();

                        
                        sqlConn.Close();
                    
                
            

这里是json:


  "@count": 2,
  "@start": 1,
  "@totalcount": 2,
  "Messages": [],
  "ResourceName": "user",
  "ReturnCode": 0,
  "content": [
    "user": 
      "name": "Eric",
      "age": "25",
      "date": "2021-10-23T11:18:10+00:00",
    ,
    "user": 
      "name": "Paul",
      "age": "30",
      "date": "2021-10-23T11:18:10+00:00",
    ]

这里的错误: Newtonsoft.Json.JsonSerializationException: 'Unexpected JSON token when reading DataTable: StartObject. Path 'content[0].user', linke 9, position 20.'

我认为问题在于获取的 json 在内容下具有带有子属性的属性。但我不知道如何解决这个问题。

非常感谢您的帮助。

问候, 编辑

【问题讨论】:

您发布的json无效。能贴出真实的json吗? "@count": 2, "@start": 1, "@totalcount": 2, "Messages": [], "ResourceName": "user", "ReturnCode": 0 ,“内容”:[ “用户”:“名称”:埃里克,“年龄”:“25”,“日期”:“2021-10-23T11:18:10 + 00:00”,, “用户”:“姓名”:保罗,“年龄”:“30”,“日期”:“2021-10-23T11:18:10+00:00”,, 这是我在使用 api 时得到的 您的 JSON 以右大括号开头?那是无效的json。生成 json 的任何东西都做得非常糟糕。我看到以逗号结尾的部分,这也是无效的。询问创建此 json 的人使用有效的 JSON 生成器。我猜他们正在尝试手动操作(但失败了)。 很抱歉。只是复制错误。应该工作正常。由于隐私问题,我只需要修改内容。 json现在应该是好的。我更新了它 【参考方案1】:

首先,从循环中删除连接声明,因为您的应用程序会因此而遭受性能下降(最大化池)

其次,最好将 API 的响应转换为对象;那么它会让你的工作更容易完成。

现在,问题可能是,

    API 中 name 参数的数据类型不是字符串。因此,您需要将其与列属性类型对齐

    确保 JSON 格式正确。它应该是字符串:字符串 例如“名称”:“***”

【讨论】:

感谢您的回答。我会从循环中删除连接 - 谢谢 1.你是对的,这应该是一个布尔值。我会改变它。 2. 我无法调整 JSON。这是我正在使用的 api 请求。问题在代码处理我认为的参数之前开始。 将 json 响应映射到一个对象。您不会收到该错误,或​​者更容易排除故障 你熟悉oop吗? 你能把响应映射到一个对象吗?是的,但非常基本。我为 api 创建了一个模型,但我不确定映射是如何工作的

以上是关于获取 REST API 数据并使用 C# 将它们保存到 SQL 表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 rest api 从 github 为用户(人)获取数据?

使用 C# REST API 从 TFS 获取用户身份

如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?

WordPress REST API 未检索所有数据

如何将带有数据的http标头发送到rest Api codeigniter?

使用 C# 从 Unity 中的 REST Api 无延迟或抖动地检索数据