簡體   English   中英

C#使用SqlKata(或者只是ADO.NET)從動態對象到SQL插入語句

[英]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比提供幫助更多的障礙。 如果已將columnsvalues聲明為預期的類型,則編譯器將立即顯示它們是否與linq查詢生成的內容匹配。

SqlKata函數Insert用於多次插入,因此需要一組插入值列表:

var queryResult = db.Query(r.TableRef).Insert(columns, new[]{values});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM