RESTAPI(JSON),使用Windows控制台应用程序和计划任务更新SQL表
我是JSON编程的新手。我的大部分经验都是用C语言编写的,有些是用XML和Javascript编写的。所以我有点迷路了。我会尽量具体一些 我已经编写了一个通过任务调度器运行的windows控制台应用程序。基本上,windows应用程序应该从外部公司管理的站点获取API,但信息归我的公司所有,并将信息放在SQL表中。API非常标准,是用JSON编写的 我成功地解析了JSON语言并(例如)在命令提示符中显示它,但我需要能够解析该语言并将其放入SQL表中。我已经阅读了有关SQL注入攻击的文章,我相当有信心我们已经在这里介绍了我们的基础。因此,问题在于,当应用程序通过调度器或不使用调度器运行时,它不会更新表 我在下面介绍了一点JSON语言以及我的控制台应用程序的语言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注入攻击的文章,我相当有
{"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循环所需的更改。感谢您提供此信息。设定值的错误是一个新手在额头上拍手的错误。我同意您关于添加更新字段以跟踪更新的评论。我有首字母的原因