asp.net SqlParser无法处理.net 6中的随机字

t0ybt7op  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(104)

下面是我传递给命令的函数,用于验证字符串是否是有效的SQL查询。

using Microsoft.SqlServer.TransactSql.ScriptDom;
using ParseError = Microsoft.SqlServer.TransactSql.ScriptDom.ParseError;

namespace QueryStore.Application.Utils;

internal static class SqlParser
{
    internal static List<string>? Parse(string sql)
    {
        var parser = new TSql100Parser(false);
        parser.Parse(new StringReader(sql), out IList<ParseError> errors);
        return errors is not { Count: > 0 } ? null : errors.Select(error => error.Message).ToList();
    }
    
    internal static bool BeValidSqlQuery(string content)
    {
        var result = SqlParser.Parse(content);
        return result is null;
    }

}

此输入给出错误:"Select From XYZ"
下面是它接受的一些输入字符串

"sdcsdcsdcsdcsjnjkc"
"csdcsdc sdcsdcsdc"

我如何才能避免这种情况发生。是否有其他现有的函数或其他库可以使用?

z31licg0

z31licg01#

我也在做这件事。我担心的是Parse所做的事情。
Parse方法确实验证输入,但是它处理的不仅仅是sql语句。当你给予你提到的字符串时,它被识别为标识符,所以字符串将作为TSqlFragment返回。这就是为什么没有错误。

当你输入像123和abc这样的随机单词时,它也会返回错误,不是因为它是不正确的sql,而是因为它不能被正确地识别为标识符。

要使用Parse验证sql,您需要给予进一步的验证,例如检查它是否继承自TSqlStatement。您可以编写scriptTokenStream的子级的文本和类型来检查验证过程。

var sqlresult = parser.Parse(new StringReader(sql), out IList<ParseError> errors);
    foreach (var child in sqlresult.ScriptTokenStream)
    {
        Console.WriteLine("{0} : {1}", child.Text, child.TokenType);
    }

ParseStatementList方法是只验证SQL的简单而正确的方法。它将返回StatementList的对象,其中每个句子都继承自TSqlStatement。

相关问题