C# C使用SqlKata(或ADO.NET)从动态对象获取SQL Insert语句
请容忍我在这里,我已经工作了几个小时,感觉我开始感到疲劳,犯错误,看不到我应该看到的。如果这是一个愚蠢的问题,我道歉。我有一个动态对象的循环。这些动态对象可以具有不同的形状,最终将插入到与动态对象属性的列名匹配的数据库表中。因此,如果对象具有“Title=Mr”,则数据库中将有一个名为“Title”的数据库列 我有下面的循环,在这里我试图以某种方式将我的动态对象转换为一个列名数组和一个值数组,然后以某种方式使用我的Insert语句中的列名和值数组,并使用SqlKata对SQL Server使用SqlKata。我对一个简单的旧ADO.NET解决方案持开放态度 然而,它被严重破坏了,我认为压力让我看不到一个更简单的方法来转动这样一个动态对象:C# C使用SqlKata(或ADO.NET)从动态对象获取SQL Insert语句,c#,sql,json,dynamic,sqlkata,C#,Sql,Json,Dynamic,Sqlkata,请容忍我在这里,我已经工作了几个小时,感觉我开始感到疲劳,犯错误,看不到我应该看到的。如果这是一个愚蠢的问题,我道歉。我有一个动态对象的循环。这些动态对象可以具有不同的形状,最终将插入到与动态对象属性的列名匹配的数据库表中。因此,如果对象具有“Title=Mr”,则数据库中将有一个名为“Title”的数据库列 我有下面的循环,在这里我试图以某种方式将我的动态对象转换为一个列名数组和一个值数组,然后以某种方式使用我的Insert语句中的列名和值数组,并使用SqlKata对SQL Server使用S
{
"TRS_KEY": 712134,
"TRS_PTR": 16974,
"TailFlags": 0,
"RRP": 49.95,
"PriceType": 1,
"PromoID": 194814003
}
假设我在其他地方准备好了表变量
INSERT INTO <TABLE> (TRS_KEY,TRS_PTR,TailFlags,RRP,PriceType,PromoId) VALUES(712134,16974... and so on
我到了下面,但完全搞砸了。我显然离这里很远
foreach (dynamic d in r.Data)
{
try
{
context.Logger.LogLine($"Original dynamic object serialised to JSON -> {JsonConvert.SerializeObject(d)}");
JObject o = JObject.Parse(JsonConvert.SerializeObject(d));
var result = o.Descendants()
.OfType<JProperty>()
.Select(p => new KeyValuePair<string, object>(p.Path,
p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object
? null : p.Value));
var columns = result.Select(pairs => result.Select(pair => pair.Key).ToArray().ToString());
context.Logger.LogLine($"COLUMNS {JsonConvert.SerializeObject(columns)}");
var values = result.Select(pairs => result.Select(pair => pair.Value).ToArray());
context.Logger.LogLine($"VALUES TO GO INTO INSERTS {JsonConvert.SerializeObject(values)}");
var queryResult = db.Query(r.TableRef).Insert(columns, values);
db.Logger = compiled => {
context.Logger.Log($"{compiled.ToString()}");
};
}
catch (Exception ex)
{
context.Logger.LogLine($"{ex.ToString()}");
}
}
以下是哪些产品:/
我通常不会诉诸于“情感”方面,但如果有人能提供帮助并在此刻保留判断,我将不胜感激。我只有这个周末的时间让这个概念开始运作,我想我开始觉得我无法逃避我自己的头脑足够长的时间来简单而干净地解决这个问题
编辑-尝试了以下答案,但现在遇到此问题:
foreach (dynamic d in r.Data)
{
//context.Logger.LogLine($"{d.GetType()}");
try
{
context.Logger.LogLine($"{r.TableRef} {JsonConvert.SerializeObject(d)}");
JObject o = d;
var result = o.Descendants()
.OfType<JProperty>()
.Select(p => new KeyValuePair<string, object>(p.Path,
p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object
? null : p.Value));
IEnumerable<string> columns = result.Select(p => p.Key);
IEnumerable<object> values = result.Select(p => p.Value);
var queryResult = db.Query(r.TableRef).Insert(columns, values);
错误:Insertcolumns、values中的值下方红色扭曲
Severity Code Description Project File Line Suppression State
Error CS1503 Argument 3: cannot convert from 'System.Collections.Generic.IEnumerable<object>' to 'System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<object>>' S2CProcessDataStateMachine C:\Users\jmatson\source\repos\S2CProcessDataStateMachine\S2CProcessDataStateMachine\StepFunctionTasks.cs 113 Active
编辑:
改为
JObject o = d;
var result = o.Descendants()
.OfType<JProperty>()
.Select(p => new KeyValuePair<string, object>(p.Path,
p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object
? null : p.Value));
IEnumerable<string> columns = result.Select(p => p.Key);
IEnumerable<object> values = result.Select(p => p.Value);
// Add custom columns
IEnumerable<string> colAdded = columns.Add("STORE_ID").Add("last_modified");
IEnumerable<object> valAdded = values.Add(state.StoreId).Add(DateTime.Now);
var queryResult = db.Query(r.TableRef).AsInsert(colAdded, valAdded );
queryResult.Get();
在尝试SQL插入之前,这不会导致任何错误。正如您在上面看到的,我在插入之前添加了两个附加列和值。所有列都会显示在insert语句中,但请注意,只有我手动添加的两个值会显示吗?其余的都是空的
在[TLog010000ItemSale][TRS_KEY]、[TRS_PTR]、[PLUID]中插入,
[Ext11],[Subtract],[Cancel],[Negative],[FuelItemCancel],
[StaffDiscAllow]、[PriceOveride]、[OnSale]、[WSPriceOverride],
[ManPrice]、[ManPriceAllw]、[NoManWgnt]、[WgtItem]、[DecItem],
[加仑],[链PRV],[非汞],[仓库CPN],[供应商CPN],[配电盘],
[扫描],[ReadSrv],[NextInfo],[ReplUnknown],[GSTExclFollow],
[PriceGrid]、[DepID]、[MSU]、[RetnID]、[TaxF]、[QTY]、[Price],
[金额],[不包括价格],[数量],[箱子数量],[尾标志],
[NoStockDecrete]、[NoLoyaltyPoints]、[STORE\u ID]、[last\u modified]
价值观
,A854,2019-08-03 12:11:10
如果结果的类型为IEnumerable,那么获取列和值列表的linq就是一个简单的linq选择。KeyValuePair的键中可能有空值,因此请先删除这些值:
result = result.Where(x => x.Key != null);
IEnumerable<string> columns = result.Select(p => p.Key);
IEnumerable<object> values = result.Select(p => p.Value);
什么是运行时的d?它是一个包含您所显示内容的字符串,还是一个匿名类型?d是-{TRS_KEY:712134,TRS_PTR:16974,TailFlags:0,RRP:49.95,PriceType:1,PromoID:194814003}它可能是另一个JSON对象,但总是采用{thing:value}的JSON格式。这是无效的C,它是JSON对象的字符串化。d的C型是什么?如果您登录d.GetType,会得到什么?抱歉,是Newtonsoft.Json.Linq.JObjectOK谢谢。我不明白为什么要序列化,然后解析以将其转换回JObject。下一步,结果的类型是什么?通过此尝试更新了我的问题。关闭,但现在仍然失败,出现另一个错误。这些列和值在我看来是正确的,但在构造SqlKata插入时失败。请参见editOK,我看到我误读了文档,insert用于多个插入,并且需要一个值数组数组。我将更新答案。这阻止了错误,这很好,列部分工作正常,但值部分在SQL INSERT中显示为值,,,,,,,,,,,,因此没有添加任何内容…如果我在valAdded中迭代foreach var v,我可以将对象序列化为JSON,并查看每个字段的值。我不知道为什么在insert语句中它是空白的……我建议您将我的答案标记为已接受,因为它整理了原始问题,然后用一个仅包含两个集合和insert的最小示例打开一个关于SqlKata insert的新问题。这样你会得到一个明确的答案。
var queryResult = db.Query(r.TableRef).Insert(columns, new[]{values});