【问题标题】:Insert JObject list to SQL Server with dapper使用 dapper 将 JObject 列表插入 SQL Server
【发布时间】:2020-10-02 17:39:18
【问题描述】:

我需要将JObject 的结果插入SQL Database。但是它一直说我不允许插入数组、列表?

我做错了什么?

这是我目前得到的:

JArray jsonArray = JArray.Parse(sb.ToString());

var jsonObjects = jsonArray.OfType<JObject>().ToList();

     using (SqlConnection connection = new SqlConnection(connectionstring))
         {                    
             connection.Open();
             connection.Execute(@"Insert into dbo.JsonMeta values(@meta)", jsonObjects);                   
         }

jsonObjects 的结果:

计数:57000 行

row[0] 看起来像这样:

{{
  "ID": "asdasdasdasdIndenlandsk",
  "FLYTTEDATO": "01/02/2020",
  "FLYTTE_TIDSPUNKT": "1000",
  "R�KKEF�LGE_FLYTNING": null,
  "FRA_CHR": "asdasdasdasd",
  "TIL_CHR": "asdasdasd",
  "ANTAL": "asdasdasdasd",
  "ANTAL_CONTAINERE": null,
  "INDBERETTER_LOGON": "asdasdasd:assdaasdasd",
  "BIL_ANVENDELSE": "FORVOGN",
  "REGISTRERINGSNUMMER FORVOGN": "XXXXXX",
  "BIL_NATIONALITET FORVOGN": "XXXXX",
  "FRAFLYT_NATION": null,
  "TILFLYT_NATION": null,
  "REGISTRERINGSNUMMER H�NGER": null,
  "BIL_NATIONALITET H�NGER": null,
  "REGISTRERINGSNUMMER OML�SSER FORVOGN": null,
  "BIL_NATIONALITET OML�SSER FORVOGN": null,
  "REGISTRERINGSNUMMER OML�SSER H�NGER": null,
  "BIL_NATIONALITET OML�SSER H�NGER": null,
  "TRACES DOKNR": null,
  "SLETMARKERING": "0",
  "DATO_OPRET": "2020-06-02 08:33:54",
  "BESNR_AFSENDER": "asdasdasdasdasd",
  "BESNR_MODTAGER": "asdasdasd",
  "BRUGER_AFSENDER_CVR_NR": "sdfsdf324234",
  "BRUGER_AFSENDER_NAVN": "asdasdasdasd",
  "BRUGER_AFSENDER_ADRESSE": "asdasdasdasd",
  "BRUGER_AFSENDER_BYNAVN": "adsasdasd",
  "BRUGER_AFSENDER_POSTNR": "adsasdasd",
  "BRUGER_AFSENDER_POSTDISTRIKT": "adsasdasd",
  "BRUGER_AFSENDER_REKLAMEBESKYTTET": null,
  "BRUGER_MODTAGER_CVR_NR": "adasdasdasd",
  "BRUGER_MODTAGER_NAVN": "asdasdasdasd",
  "BRUGER_MODTAGER_ADRESSE": "adasdasd",
  "BRUGER_MODTAGER_BYNAVN": "asdasdasd",
  "BRUGER_MODTAGER_POSTNR": "adasdasd",
  "BRUGER_MODTAGER_POSTDISTRIKT": "asdasdasd",
  "BRUGER_MODTAGER_REKLAMEBESKYTTET": null,
  "BESSTR_SOER": "0",
  "BESSTR_SLAGTESVIN": "asdasdasdasdasd",
  "BESSTR_SMAAGRISE": "0",
  "ANTAL_SLAGTESVIN_DAKA": null,
  "ANTAL_SOER_DAKA": null,
  "PRAKSIS_NR": "asdasdasd",
  "PRAKSIS_NAVN": "asdasdasdasdasd",
  "PRAKSIS_ADRESSE": "asdasdasdasdasd",
  "PRAKSIS_BYNAVN": null,
  "PRAKSIS_POSTNR": "asdasdasd",
  "PRAKSIS_POSTDISTRIKT": "asdasdasdasdasd"
}}

错误:

Exception Type: System.InvalidOperationException
TargetSite: CacheInfo GetCacheInfo(Identity, System.Object, Boolean)
Message: An enumerable sequence of parameters (arrays, lists, etc) is not allowed in this context
Data: System.Collections.ListDictionaryInternal
HelpLink: NULL
Source: Dapper
HResult: -2146233079

【问题讨论】:

    标签: c# json sql-server tsql dapper


    【解决方案1】:

    这个问题可能需要更多上下文,目前我们不知道您的数据库是什么或看起来像什么。

    例如,您是否正在使用 MySQL 并尝试仅将 JSON 存储为字符串? 或者您是否尝试将 JSON 对象存储到具有相同列数的表中?

    JArray jsonArray = JArray.Parse(sb.ToString());
    var sb = new StringBuild("Insert into dbo.JsonMeta values");
    for(int i =0; i < jsonArray.Length; i++)
    {
      sb.AppendLine($"(@meta{i}),");
    }
    using (SqlConnection connection = new SqlConnection(connectionstring))
    {                    
      connection.Open();
      connection.Execute(sb.ToString().TrimEnd(','), jsonArray.OfType<JObject>().Select(item => item.ToStirng()).ToArray());                   
    }
    

    【讨论】:

    • 仅作为字符串 - 不在相同数量的列中
    • 一个标签不启蒙。
    • 您要么需要遍历数组并添加每个元素,然后将数组中的每个项目添加到表中,请注意您需要将数组转换为字符串。
    • 没有办法绕过foreach?
    • 我刚刚写了这个 "connection.Execute(@"Insert into dbo.JsonMeta values(@meta)", new {meta = jsonObjects.ToArray().ToString() } );"第一次我没有收到错误。但它插入了这条记录“Newtonsoft.Json.Linq.JObjecet[] 代替:D
    【解决方案2】:

    Dapper.Contrib 支持插入项目列表。

    connection.Insert(jsonObjects);
    

    当然,您必须提供适当的 DTO。我不确定JObject 是否符合条件。

    【讨论】:

      猜你喜欢
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多