c# - 无法为json文件上的详细信息数组生成插入语句,尽管它适用于master?
问题描述
问题
无法将详细信息数组从 json 文件转换为生成插入语句,并且在从文件读取以生成插入语句以获取详细信息时,它会给出错误
使用无效键值访问的 J 数组值:“表”。需要 Int32 数组索引。
对于master_table,我的代码运行良好,没有任何问题,但详细信息数组不起作用
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["details"];
string connectionstring = "Server=sdfff-PC\\SQL2014;Database=sqlm;User Id=sa;Password=abc123;";
using (SqlConnection connection = new SqlConnection(connectionstring))
{
using (SqlCommand command = new SqlCommand(JsonHelper.GetInsertStatement(m), connection))
{
connection.Open();
List<SqlParameter> lsp = JsonHelper.GetSqlParams(jo["details"]);
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);
}
预期结果
3插入语句:
预期结果是 3 语句插入:
// generated success
INSERT INTO master_table(id, branch_id, name, address, phone) VALUES(@id, @branch_id, @name, @address, @phone);
// cannot generated because error on first thread
insert into detail1_table(id,branch_id,LineNumber,ItemCode,Quantity,Price,Total) values (@id,@branch_id,@LineNumber,@ItemCode,@Quantity,@Price,@Total)
// cannot generate
insert into detail1_table(id,branch_id,LineNumber,ItemCode,Quantity,Price,Total) values (@id,@branch_id,@LineNumber,@ItemCode,@Quantity,@Price,@Total)
only work for master and another for details not work
并且当生成插入语句以获取详细信息时,给我错误 Accessed J Array values with invalid key value: "table"。需要 Int32 数组索引。
json文件
{
"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
}
}
]
}
解决方案
推荐阅读
- c# - 未经同意窗口触发 Google Apps 脚本
- web-component - 在 Web 组件中使用 Vega
- reactjs - 为什么在 ReactJS 中按钮的 onClick 事件中传递函数引用而不是方法?
- java - 声纳在杰克逊 JSON 的 REST 调用中更改对象名称的问题
- php - 你如何转义命名空间字符串
- javascript - 在数组中查找值的基准测试解决方案
- javascript - 如何删除位于 ionic 项目中的 Android Studio 项目?
- c - fopen 路径存储在变量中
- python - 在异步事件循环中调用的同步函数中等待任务
- javascript - WordPress没有显示没有插件的对象GoogleMapsAPI