[英]C# Getting from dynamic object to SQL Insert statement using SqlKata (or alternatively just ADO.NET)
請在這里忍受,我已經工作了幾個小時,覺得自己開始變得疲倦,犯了錯誤,卻看不到我應該看到的東西。 如果這是一個愚蠢的問題,我表示歉意。 我有一個動態對象循環。 這些動態對象可以具有不同的形狀,並且最終將插入與該動態對象的屬性的列名匹配的數據庫表中。 因此,如果對象的標題為“ Title = Mr”,則數據庫中將存在一個名為“ Title”的數據庫列。
我在下面的循環中,嘗試將動態對象轉換為列名和值的數組,然后使用SqlKata在SQL Server的Insert語句中使用那些對象(我對普通的舊ADO.NET)。
但是,它嚴重損壞了,我認為壓力使我看不到像這樣旋轉動態對象的簡單解決方案:
{
"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()}");
}
}
哪些產品出現以下混亂:/
我通常不會訴諸SO的“情感”方面,但是如果現在有人可以提供幫助並保留判斷力,我將不勝感激。 我只有這個周末才可以啟動並運行這個概念,我想我開始覺得自己無法逃脫足夠長的時間來簡單,干凈地解決這個問題。
編輯-嘗試了下面的答案,但現在遇到了這個問題:
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);
錯誤:(在Insert(columns,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],[Gallons],[ChainPrv],[NonMerch],[StoreCpn],[VendorCpn],[DiscAlw],[Scan ],[ReadSrv],[NextInfo],[ReplUnknown],[GSTExclFollow],[PriceGrid],[DepID],[MSU],[RetnID],[TaxF],[QTY],[Price],[Amount], [ExclPrice],[ExclAmount],[CaseQty],[TailFlags],[NoStockDeduct],[NoLoyaltyPoints],[STORE_ID],[last_modified])值(、、、、、、、、、、、、、、 ,,,,,,,,,,,,,,,,,,,,,,'A854','2019-08-03 12:11:10')
假設result
的類型為IEnumerable<KeyValuePair<string,object>>
,到達列和值列表的linq是一個簡單的linq Select
。 您可能在KeyValuePair
的Key中包含null,因此請先刪除這些null:
result = result.Where(x => x.Key != null);
IEnumerable<string> columns = result.Select(p => p.Key);
IEnumerable<object> values = result.Select(p => p.Value);
在這種情況下,使用var
比提供幫助更多的障礙。 如果已將columns
和values
聲明為預期的類型,則編譯器將立即顯示它們是否與linq查詢生成的內容匹配。
SqlKata函數Insert
用於多次插入,因此需要一組插入值列表:
var queryResult = db.Query(r.TableRef).Insert(columns, new[]{values});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.