2013-08-05 3 views
1

gudusoft (sqlparser.com)에서 제공 한 sqlparser (C#)를 사용하고 있습니다.개체에서 문자열 속성을 검색하는 C# sqlparser (gudusoft)가 너무 느림

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 번 줄은 매우 느림 (1 분 이상 소요될 수 있음). 혼란스러운 점은 디버거를 사용하여 parser.XmlText가 이미 생성되었고 3 행에서 액세스 준비가 된 것입니다. 4 행은 단지이 값에 액세스하기위한 것입니다.

어떻게 값에 액세스하는 것이 실제 생성하는 것보다 훨씬 느린가요?

저는이 새 파서의 문제가 될 가능성이 더 큰지 또는 C#의 일반적인 문제인지 여부를 확실하지 않은 의 초보자입니다.

감사!

답변

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; 
     } 

변수 본질적 XMLTEXT이다 난 디 컴파일러 및 볼을 사용했다.