我正在尝试创建一个将常规 sql 语句转换为 c# 对象的方法,因此我决定使用 Irony 来解析 sql 语句,然后我将语句作为包含语句类型及其值的操作返回,具体取决于类型
这是我未完成的代码[因为我很沮丧,因为我不知道该怎么做]
private List<Action> ParseStatement(string statement)
{
var parser = new Parser(new SqlGrammar());
var parsed = parser.Parse(statement);
var status = parsed.Status;
while (parsed.Status == ParseTreeStatus.Parsing)
{
Task.Yield();
}
if (status == ParseTreeStatus.Error)
throw new ArgumentException("The statement cannot be parsed.");
ParseTreeNode parsedStmt = parsed.Root.ChildNodes[0];
switch (parsedStmt.Term.Name)
{
case "insertStmt":
var table = parsedStmt.ChildNodes.Find(x => x.Term.Name == "Id").ChildNodes[0].Token.ValueString;
var valuesCount =
parsedStmt.ChildNodes.Find(x => x.Term.Name == "insertData").ChildNodes.Find(
x => x.Term.Name == "exprList").ChildNodes.Count;
var values = parsedStmt.ChildNodes.Find(x => x.Term.Name == "insertData").ChildNodes.Find(
x => x.Term.Name == "exprList").ChildNodes;
foreach (var value in values)
{
string type = value.Token.Terminal.Name;
}
break;
}
return null;
}
private Type ParseType(string type)
{
switch (type)
{
case "number":
return typeof (int);
case "string":
return typeof (string);
}
return null;
}
所以这里的问题是:我如何利用 Irony 将字符串 SQL 语句转换为 ac# 对象?
这是我想要实现的一个例子:
插入人的价值观(4,'Nilsen','Johan','Bakken 2','Stavanger')
并将其转换为
return new Action<string type, string table, int val1, string val2, string val3, string val4, string val5>;
动态地取决于方法从语句中读取的内容。
我希望我已经很好地解释了我的想法,所以你们可以帮助我,如果有不清楚的地方请告诉我,我会尽力解释。