c#sqlparser(gudusoft)从对象检索字符串属性:太慢
我正在使用gudusoft(sqlparser.com)提供的sqlparser(c#),不确定以前是否有人使用过它 sqlparser提供了一个解析器对象,您可以向其输入sql字符串。然后通过调用parse()方法,您可以获得所有标记、标签等。解析器构建得很好 下面是我如何使用它的,非常直截了当:c#sqlparser(gudusoft)从对象检索字符串属性:太慢,c#,performance,class,sql-parser,C#,Performance,Class,Sql Parser,我正在使用gudusoft(sqlparser.com)提供的sqlparser(c#),不确定以前是否有人使用过它 sqlparser提供了一个解析器对象,您可以向其输入sql字符串。然后通过调用parse()方法,您可以获得所有标记、标签等。解析器构建得很好 下面是我如何使用它的,非常直截了当: line 1: TGSqlParser parser = new TGSqlParser(TDbVendor.DbVMssql); // init the parser object line 2:
line 1: TGSqlParser parser = new TGSqlParser(TDbVendor.DbVMssql); // init the parser object
line 2: parser.SqlText.Text = code; // set input sql code, for e.g. "SELECT * FROM table_sales"
line 3: int parser_ret = parser.Parse(); // call parse method
line 4: string output = parser.XmlText; // retrieve the xml generated by line 3. The xmlText could be 500,000-character long.
第1-3行的工作效率非常高(在不到一秒钟的时间内完成)。但是,第4行非常慢(可能需要一分钟或更长时间)。令人困惑的是,通过使用调试器,我发现parser.XmlText已经生成,可以在第3行进行访问。第4行仅用于访问该值
为什么访问值要比实际生成值慢得多
我是c#的新手,不确定这更可能是这个特定解析器的问题还是c#的一般问题。
谢谢 没关系,我找到了原因。 这是这个特定解析器的问题 第3行的xmlText未就绪。它必须在被访问时生成。 我使用反编译器发现:
internal string i()
{
this.Parse();
string str = "<?xml version=\"1.0\" ?>";
string str1 = lzbasetype.PPAddLinebreak(str);
object[] dbVendorStr = new object[] { lzbasetype.DbVendorStr[(int)this.i] };
str = string.Concat(str1, SysUtils.Format("<sqlscript dbvendor=\"%s\">", dbVendorStr));
if (this.ErrorCount <= 0)
{
int num = this.SqlStatements.Count() - 1;
int num1 = 0;
if (num >= num1)
{
num++;
do
{
str = string.Concat(lzbasetype.PPAddLinebreak(str), this.SqlStatements[num1].AsXmlText);
num1++;
}
while (num1 != num);
}
str = string.Concat(lzbasetype.PPAddLinebreak(str), "</sqlscript>");
}
else
{
str = string.Concat(lzbasetype.PPAddLinebreak(str), "<SyntaxError>");
str = string.Concat(lzbasetype.PPAddLinebreak(str), this.ErrorMessages);
str = string.Concat(lzbasetype.PPAddLinebreak(str), "</SyntaxError>");
str = string.Concat(lzbasetype.PPAddLinebreak(str), "</sqlscript>");
}
return str;
}
内部字符串i()
{
this.Parse();
字符串str=“”;
字符串str1=lzbasetype.ppadlinebreak(str);
object[]dbVendorStr=new object[]{lzbasetype.dbVendorStr[(int)this.i]};
str=string.Concat(str1,SysUtils.Format(“,dbVendorStr));
如果(this.ErrorCount=num1)
{
num++;
做
{
str=string.Concat(lzbasetype.PPAddLinebreak(str),this.SqlStatements[num1].AsXmlText);
num1++;
}
while(num1!=num);
}
str=string.Concat(lzbasetype.ppadlinebreak(str),“”);
}
其他的
{
str=string.Concat(lzbasetype.ppadlinebreak(str),“”);
str=string.Concat(lzbasetype.ppadlinebreak(str),this.ErrorMessages);
str=string.Concat(lzbasetype.ppadlinebreak(str),“”);
str=string.Concat(lzbasetype.ppadlinebreak(str),“”);
}
返回str;
}
变量i本质上是xmlText