1

我正在使用 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# 的一般问题。

谢谢!

4

1 回答 1

0

没关系,我找到了原因。这是这个特定解析器的问题。

xmlText 在第 3 行还没有准备好。它必须在被访问时生成。我使用了反编译器,发现:

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本质上是 xmlText。

于 2013-08-05T18:19:04.277 回答