RESTAPI(JSON),使用Windows控制台应用程序和计划任务更新SQL表

RESTAPI(JSON),使用Windows控制台应用程序和计划任务更新SQL表,sql,sql-server,json,api,Sql,Sql Server,Json,Api,我是JSON编程的新手。我的大部分经验都是用C语言编写的,有些是用XML和Javascript编写的。所以我有点迷路了。我会尽量具体一些 我已经编写了一个通过任务调度器运行的windows控制台应用程序。基本上,windows应用程序应该从外部公司管理的站点获取API,但信息归我的公司所有,并将信息放在SQL表中。API非常标准,是用JSON编写的 我成功地解析了JSON语言并(例如)在命令提示符中显示它,但我需要能够解析该语言并将其放入SQL表中。我已经阅读了有关SQL注入攻击的文章,我相当有

我是JSON编程的新手。我的大部分经验都是用C语言编写的,有些是用XML和Javascript编写的。所以我有点迷路了。我会尽量具体一些

我已经编写了一个通过任务调度器运行的windows控制台应用程序。基本上,windows应用程序应该从外部公司管理的站点获取API,但信息归我的公司所有,并将信息放在SQL表中。API非常标准,是用JSON编写的

我成功地解析了JSON语言并(例如)在命令提示符中显示它,但我需要能够解析该语言并将其放入SQL表中。我已经阅读了有关SQL注入攻击的文章,我相当有信心我们已经在这里介绍了我们的基础。因此,问题在于,当应用程序通过调度器或不使用调度器运行时,它不会更新表

我在下面介绍了一点JSON语言以及我的控制台应用程序的语言

{"date":"2015-09-24","data":[{"cid":"17","rank":1},{"cid":"26","rank":1},{"cid":"80","rank":1},{"cid":"30","rank":1},{"cid":"90","rank":1},{"cid":"62","rank":1},{"cid":"147","rank":1},{"cid":"28","rank":1}"s":1,"e":null}

using System;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Formatting;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace JsonApiClient
{
    class Program
    {
        static void Main(string[] args)
        {

                ExecuteRiskSearch();
                Console.ReadLine();
        }   


    static void ExecuteRiskSearch()
        {
            string url = "https://localhost/api/getWatchList/";
            string json = new WebClient().DownloadString(url);
            JObject results = JObject.Parse(json);

            foreach (var result in results)
            {
                string cid = (string)results["CID"];
                JToken rank = results["rank"];

                string risk = "";
                if (rank is JValue)
                {
                    risk = (string)rank;
                }
                else if (rank is JArray)
                {
                    risk = (string)((JArray)rank).First;
                }
                else
                {
                    SqlConnection connection = null;
                    SqlCommand command = null;

                    try
                    {
                        connection = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=apiData;Data Source=serverName;");
                        command = new SqlCommand("UPDATE apiData.dbo.API SET [Category] WHERE CID=CID", connection);
                        connection.Open();
                        int numrows = command.ExecuteNonQuery();
                      }

                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }

                    finally
                    {
                        command.Dispose();
                        connection.Dispose();
                    }
                    }
                }
            }
        }
    }

让JSON数据更新我的SQL表缺少什么?我搜索了谷歌的搜索结果,但没有找到多少信息。任何帮助都将不胜感激

对于需要使用JSON对象的正确部分
foreach
,我的意思很简单,变量
results
包含整个JSON对象,从
“date”
“e”
。您需要从
“data”
对象开始,并遍历其数组,否则
字符串cid
将在赋值时出错,因为它将尝试将数组赋值给单个值。你的
JToken排名也是如此。我认为应该是这样的:

foreach(datum in results["data"])
{
    string cid = datum["cid"];
    JToken rank = datum["rank"];
    /* ... */
}
此外,set命令没有执行任何操作。您需要使用
SET columnName=“+newValue+”,其中CID==“+CID
来实际影响更改,其中columnName是您希望更改的列,newValue是携带所需替换的C#变量

在通过自动化流程进行更新时,如果存在更新日期字段,最好在其中包含对更新日期字段的更改。通常惯例是为表中的每一行指定一个创建日期和一个更新日期

我希望这至少为你指明了正确的方向


-C§

为了使用JSON对象的正确部分来
foreach
,我的意思很简单,您的变量
results
包括整个JSON对象,从
“date”
“e”
。您需要从
数据开始“
对象并遍历其数组或字符串cid
将在赋值时出错,因为它将尝试将数组赋值给单个值。你的
JToken排名也是如此。我认为应该是这样的:

foreach(datum in results["data"])
{
    string cid = datum["cid"];
    JToken rank = datum["rank"];
    /* ... */
}
此外,set命令没有执行任何操作。您需要使用
SET columnName=“+newValue+”,其中CID==“+CID
来实际影响更改,其中columnName是您希望更改的列,newValue是携带所需替换的C#变量

在通过自动化流程进行更新时,如果存在更新日期字段,最好在其中包含对更新日期字段的更改。通常惯例是为表中的每一行指定一个创建日期和一个更新日期

我希望这至少为你指明了正确的方向


-C§

作为一种替代方法,您可以将整个文本发送到Sql Server并加载到其中。
Sql Server 2016将使您能够存储JSON。在旧版本中,您可以使用现有的CLR/JSON库,例如或。

作为替代方案,您可以将整个文本发送到Sql Server并加载到那里。
Sql Server 2016将使您能够存储JSON。在旧版本中,您可以使用现有的CLR/JSON库,例如或。

您的JSON缺少最后一个数据对象后的结束符
],
。对于JSON解析,您需要将foreach循环移动到数据对象数组中,并将主对象的其他属性应用到其中的每一个SQL insert的条目。这有帮助吗?你是对的,我复制代码时删除了括号。很抱歉,我被你的语句弄糊涂了。我认为我的每次查看都引用了数据对象“结果”“。您的JSON缺少最后一个数据对象后的结束符
],
。对于JSON解析,您需要将foreach循环移动到数据对象数组,并将主对象的其他属性应用于SQL插入的每个条目。这有帮助吗?你是对的,我在复制代码时删除了括号。很抱歉,我对你的陈述感到困惑。我以为我的每次查看都引用了数据对象“results”。谢谢您提供的信息。设定值的错误是一个新手在额头上拍手的错误。我同意您关于添加更新字段以跟踪更新的评论。我最初采取这一步骤的原因是,我们的价值观每天都在更新,无论是否有变化。这是因为用户可以更改应用程序中的数据,我希望在业务开始时确保数据的准确性。我将重新评估我的思维过程。我不知道你所说的“web服务需要修复”是什么意思。修复了引用JSON对象数组的@LPompa不完整的问题。如果是web服务错误(不包括结尾的
],
),则web服务将需要修复,但由于它是一个错误复制,因此不需要web服务修复。@LPompa已更新,以反映对解析和foreach循环所需的更改。感谢您提供此信息。设定值的错误是一个新手在额头上拍手的错误。我同意您关于添加更新字段以跟踪更新的评论。我有首字母的原因