Как сгенерировать параметризованный оператор insert для деталей с master master work, но без деталей ?
проблема
когда получить данные из json-файла для master it work, но детали не работают ?
{ "master" : { "table" : "master_table", "fields" : { "name" : "bar", "address" : "fleet street", "phone" : "555" }, "keys":{ "id" : 1, "branch_id" : 1 } }, "details" : [ { "table": "detail1_table", "keys":{ "id" : 1, "branch_id" : 1 , "LineNumber" : 1 }, "fields" : { "ItemCode" : "item-5050", "Quantity" : 10 , "Price" : 50 , "Total" : 500 } }, { "table": "detail1_table", "keys":{ "id" : 1, "branch_id" : 1 , "LineNumber" : 2 }, "fields" : { "ItemCode" : "item-9050", "Quantity" : 5 , "Price" : 20 , "Total" : 100 } } ] }
Ожидаемый результат-3 заявления insert
// generated success
INSERT INTO master_table(id, branch_id, name, address, phone) VALUES(@id, @branch_id, @name, @address, @phone);
// generated problem
insert into detail1_table(id,branch_id,LineNumber,ItemCode,Quantity,Price,Total) values (@id,@branch_id,@LineNumber,@ItemCode,@Quantity,@Price,@Total)
// generated problem
insert into detail1_table(id,branch_id,LineNumber,ItemCode,Quantity,Price,Total) values (@id,@branch_id,@LineNumber,@ItemCode,@Quantity,@Price,@Total)не генерировать
Что я уже пробовал:
public static class JsonHelper { public static string GetInsertStatement(JToken mastertoken) { return string.Format("INSERT INTO {0}({1}) VALUES({2});", mastertoken["table"], GetFieldParameterNames(mastertoken), GetFieldParameterNames(mastertoken, false)); } static string GetFieldParameterNames(JToken mastertoken, bool fieldOnly = true) { string p = fieldOnly ? string.Empty : "@"; return string.Concat(string.Join(", ", mastertoken["keys"].Cast<JProperty>().Select(jp => p + jp.Name)), ", ", string.Join(", ", mastertoken["fields"].Cast<JProperty>().Select(jp => p + jp.Name))); } public static List<SqlParameter> GetSqlParams(JToken mastertoken) { List<SqlParameter> para = new List<SqlParameter>(); foreach (JToken jt in mastertoken["keys"]) para.Add(new SqlParameter("@" + jt.ToObject<JProperty>().Name, jt.First)); foreach (JToken jt in mastertoken["fields"]) para.Add(new SqlParameter("@" + jt.ToObject<JProperty>().Name, jt.First)); return para; } public static string GetInsertStatmentText(string JsonData) { string Insert = ""; JObject jo = JObject.Parse(JsonData); JToken m = jo["master"]; string connectionstring = "Server=sdfff-PC\\SQL2014;Database=sqlm;User Id=sa;Password=abc123;"; //change connection string using (SqlConnection connection = new SqlConnection(connectionstring)) { using (SqlCommand command = new SqlCommand(JsonHelper.GetInsertStatement(m), connection)) { connection.Open(); List<SqlParameter> lsp = JsonHelper.GetSqlParams(jo["master"]); foreach (SqlParameter sqp in lsp) command.Parameters.Add(sqp); Insert = command.CommandText; } } return Insert; } program.cs static void Main(string[] args) { string JsonData = File.ReadAllText("D:\\2.json"); string insertStatment = JsonHelper.GetInsertStatmentText(JsonData); }
Richard Deeming
В вашем коде нет абсолютно ничего, что даже пытается взглянуть на details
массив из файла JSON. Вы создаете команду для master
возражайте, а потом остановитесь.
Почему вы ожидаете, что этот код будет генерировать команды вставки для записей в details
массив?