Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#sqlparser(gudusoft)从对象检索字符串属性:太慢_C#_Performance_Class_Sql Parser - Fatal编程技术网

c#sqlparser(gudusoft)从对象检索字符串属性:太慢

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:

我正在使用gudusoft(sqlparser.com)提供的sqlparser(c#),不确定以前是否有人使用过它

sqlparser提供了一个解析器对象,您可以向其输入sql字符串。然后通过调用parse()方法,您可以获得所有标记、标签等。解析器构建得很好

下面是我如何使用它的,非常直截了当:

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