ahmed elbarbary

ahmed elbarbary

  • 1.5k
  • 317
  • 11.9k

How to generate parametrized insert statement for details wi

Aug 14 2019 5:55 PM
problem
when get data from json file for master it work but details not work ?
  1. {  
  2. "master" : {  
  3. "table" : "master_table",  
  4. "fields" : {  
  5. "name" : "bar",  
  6. "address" : "fleet street",  
  7. "phone" : "555"  
  8. },  
  9. "keys":{  
  10. "id" : 1,  
  11. "branch_id" : 1  
  12. }  
  13. },  
  14. "details" : [  
  15. {  
  16. "table""detail1_table",  
  17. "keys":{  
  18. "id" : 1,  
  19. "branch_id" : 1 ,  
  20. "LineNumber" : 1  
  21. },  
  22. "fields" : {  
  23. "ItemCode" : "item-5050",  
  24. "Quantity" : 10 ,  
  25. "Price" : 50 ,  
  26. "Total" : 500  
  27. }  
  28. },  
  29. {  
  30. "table""detail1_table",  
  31. "keys":{  
  32. "id" : 1,  
  33. "branch_id" : 1 ,  
  34. "LineNumber" : 2  
  35. },  
  36. "fields" : {  
  37. "ItemCode" : "item-9050",  
  38. "Quantity" : 5 ,  
  39. "Price" : 20 ,  
  40. "Total" : 100  
  41. }  
  42. }  
  43. ]  
  44. }  
Expected Result is 3 statement insert :
  1. // generated success  
  2.   
  3. INSERT INTO master_table(id, branch_id, name, address, phone) VALUES(@id, @branch_id, @name, @address, @phone);  
  4.   
  5. // generated problem  
  6.   
  7. insert into detail1_table(id,branch_id,LineNumber,ItemCode,Quantity,Price,Total) values (@id,@branch_id,@LineNumber,@ItemCode,@Quantity,@Price,@Total)  
  8.   
  9.   
  10. // generated problem  
  11.   
  12.   
  13. insert into detail1_table(id,branch_id,LineNumber,ItemCode,Quantity,Price,Total) values (@id,@branch_id,@LineNumber,@ItemCode,@Quantity,@Price,@Total)  
What I have tried:
  1. public static class JsonHelper  
  2. {  
  3. public static string GetInsertStatement(JToken mastertoken)  
  4. {  
  5. return string.Format("INSERT INTO {0}({1}) VALUES({2});",  
  6. mastertoken["table"],  
  7. GetFieldParameterNames(mastertoken),  
  8. GetFieldParameterNames(mastertoken, false));  
  9. }  
  10.   
  11. static string GetFieldParameterNames(JToken mastertoken, bool fieldOnly = true)  
  12. {  
  13. string p = fieldOnly ? string.Empty : "@";  
  14. return string.Concat(string.Join(", ", mastertoken["keys"].Cast<JProperty>().Select(jp => p + jp.Name)),  
  15. ", "string.Join(", ", mastertoken["fields"].Cast<JProperty>().Select(jp => p + jp.Name)));  
  16. }  
  17.   
  18. public static List<SqlParameter> GetSqlParams(JToken mastertoken)  
  19. {  
  20. List<SqlParameter> para = new List<SqlParameter>();  
  21. foreach (JToken jt in mastertoken["keys"])  
  22. para.Add(new SqlParameter("@" + jt.ToObject<JProperty>().Name, jt.First));  
  23. foreach (JToken jt in mastertoken["fields"])  
  24. para.Add(new SqlParameter("@" + jt.ToObject<JProperty>().Name, jt.First));  
  25. return para;  
  26. }  
  27.   
  28. public static string GetInsertStatmentText(string JsonData)  
  29. {  
  30. string Insert = "";  
  31. JObject jo = JObject.Parse(JsonData);  
  32. JToken m = jo["master"];  
  33. string connectionstring = "Server=sdfff-PC\\SQL2014;Database=sqlm;User Id=sa;Password=abc123;"//change connection string  
  34. using (SqlConnection connection = new SqlConnection(connectionstring))  
  35. {  
  36. using (SqlCommand command = new SqlCommand(JsonHelper.GetInsertStatement(m), connection))  
  37. {  
  38. connection.Open();  
  39. List<SqlParameter> lsp = JsonHelper.GetSqlParams(jo["master"]);  
  40. foreach (SqlParameter sqp in lsp)  
  41.   
  42. command.Parameters.Add(sqp);  
  43.   
  44.   
  45. Insert = command.CommandText;  
  46. }  
  47. }  
  48.   
  49. return Insert;  
  50.   
  51. }  
  52. program.cs  
  53. static void Main(string[] args)  
  54. {  
  55.   
  56.   
  57. string JsonData = File.ReadAllText("D:\\2.json");  
  58.   
  59. string insertStatment = JsonHelper.GetInsertStatmentText(JsonData);  
  60. }  

Answers (2)