使用Windows控制台应用程序和计划任务

时间:2015-09-24 15:59:37

标签: sql sql-server json api

我是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表?我搜索过Google搜索结果,但我找不到太多信息。任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

对于foreach需要JSON对象的正确部分,我的意思很简单,你的变量results包含整个JSON对象,从"date""e"。您需要从"data"对象开始并遍历其数组,否则string cid将在分配时出错,因为它将尝试将数组分配给单个值。您的JToken rank也是如此。我相信它应该是这样的:

foreach(datum in results["data"])
{
    string cid = datum["cid"];
    JToken rank = datum["rank"];
    /* ... */
}

此外,您的set命令没有做任何事情。您需要使用SET columName = " + newValue + " WHERE CID == " + cid来实际影响更改,其中columnName是您要更改的列,newValue是您携带所需替换的C#变量。

最佳做法是在通过自动化流程进行更新时包含对更新日期字段的更改(如果存在)。通常,约定是为表中的每一行创建一个日期和更新日期。

我希望这至少可以指出你正确的方向。

-C§

答案 1 :(得分:0)

作为替代方案,您可以将整个文本发送到Sql Server并将其加载到那里。 Sql Server 2016将允许您存储JSON using single command - OPENJSON。在旧版本中,您可以使用现有的CLR / JSON库,例如Json4SqlJsonSelect

相关问题