【问题标题】:using C# update SQL table from a JSON使用 C# 从 JSON 更新 SQL 表
【发布时间】:2021-06-07 23:46:09
【问题描述】:

我正在调用一个输出 JSON 有效负载的 Web 服务,JSON 字符串具有 productNamepackageIdwebReferenceId。调用 Web 服务时,productName 作为查询字符串传递。我能够传递查询字符串并检索具有 productNamepackageIdwebReferenceIdJSON 有效负载,如下所示。

JSON:

{
    "product": [
        {           
            "product": "adc",
            "pkgid": 1124245,
            "wrfid": 5387612
        }
    ]
}

使用下面的C# 代码检索JSON 有效负载。

C#:

var jsondata = new WebClient();
string prdcode = jsondata.DownloadString(new Uri(url));

JavaScriptSerializer jss = new JavaScriptSerializer
{
    MaxJsonLength = Int32.MaxValue
};
Rootobject ro = jss.Deserialize<Rootobject>(prdcode);

现在,我必须使用来自 JSON 输出的 packageIdwebReferenceId 更新 SQL 表。我正在将JSON 结果读入DataReader,但不确定如何将UPDATE 读入SQL 表。

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("packageId", typeof(int)));
dt.Columns.Add(new DataColumn("webReferenceId", typeof(int)));
DataRow dr = dt.NewRow();

foreach (var product in ro.data)
{
    dr["packageId"] = product.pkgid;
    dr["webReferenceId"] = product.wrfid;
}

【问题讨论】:

  • 您使用什么库来访问 SQL 服务器?实体框架? LINQ2SQL?普通的旧 System.Data.SqlClient?
  • 嗨@Corey,普通的旧System.Data.SqlClient。
  • 喜欢硬着头皮做事,对吧? :) 好吧...让我玩一下 BulkCopy 之类的东西,看看我能做什么。
  • 出于兴趣...您使用 SqlClient 而不是 ORM 的任何原因?一直与DataTables 打交道很烦人,你不觉得吗?
  • 嗨@Corey,这是我支持的遗留代码。会有很多重写。这是针对供应商应用程序的,他们很快就会升级并迁移到云端。

标签: c# sql json sqldatareader


【解决方案1】:

执行此操作的“最佳”方法取决于您希望处理的行数。如果只有几行,则继续使用一系列参数化的INSERT INTO... 命令插入它们。

对于更大的列表,尽管SqlBulkCopy 对象将采用DataTableIDataReader 并将内容批量上传到您的表中。

// abstracting the setup for brevity - you can write these :)
var source = LoadDataTable();
var connection = GetSqlConnection();

// now the bulk copy:
using (var bulk = new SqlBulkCopy(connection))
{
    bulk.DestinationTableName = "your_table";
    bulk.WriteToServer(source);
}

这将尝试将行直接转储到表中。如果数据类型等有任何不同,则插入将失败并显示错误消息,(希望)将解释发生了什么问题。

您必须确保源数据不违反任何约束,例如复制现有主键等,并且它与目标表的格式相匹配。

根据您的用例,将数据加载到临时表(临时或其他)中,然后使用MERGE 更新最终目标可能会有所帮助。这可以帮助处理主键违规等问题。它还允许您使用 SQL 服务器本身上的查询和存储过程执行一些 ETL 任务,而不是提取大量数据,将其全部匹配并推回。

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多