使用 C# 进行查询验证

Posted

技术标签:

【中文标题】使用 C# 进行查询验证【英文标题】:Query validation using C# 【发布时间】:2019-08-30 17:55:44 【问题描述】:

我正在寻找 C# 中的查询验证器,它允许我从文本框中解析 SQL 文本,并在发送它执行(MS SQL 或 DB2 查询)之前验证它是否正确。

【问题讨论】:

MS SQL - 是最好的查询验证器。将查询发送给它,如果查询错误,它将抛出异常。 :) 此外,相同的查询对于一个数据库引擎可能是正确的,而对于另一个数据库引擎可能是不正确的。为什么不让数据库引擎验证? 在 MS SQL 上执行 SQL,这会在无效查询上抛出异常,但潜在的危害在于这些查询将被触发,因为我唯一的目的是测试语法。如果是 DB2 呢? 什么开销?数据库查询验证是查询工作流程中的第一步。它不仅会验证语法,还会检查表或列是否存在以及诸如此类的各种事情。 【参考方案1】:

如果您想在不使用数据库的情况下验证 SQL 语法,TSql100Parser 类将非常适合这种情况。

免责声明,代码从这里的帖子中借用Code to validate SQL Scripts

虽然使用起来非常简单。如果返回null,则解析没有错误。

using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;

public class SqlParser

        public List<string> Parse(string sql)
        
            TSql100Parser parser = new TSql100Parser(false);
            IScriptFragment fragment;
            IList<ParseError> errors;
            fragment = parser.Parse(new StringReader(sql), out errors);
            if (errors != null && errors.Count > 0)
            
                List<string> errorList = new List<string>();
                foreach (var error in errors)
                
                    errorList.Add(error.Message);
                
                return errorList;
            
            return null;
        

【讨论】:

我错过了什么吗?我无法获得 Microsoft.Data 的参考资料。我正在使用 VS2010 @Kunal 您必须右键单击引用并将此引用添加到您的项目中,然后才能执行 using 语句来包含它。 好吧,我已经添加了两个引用 Microsoft.Data.Schema.ScriptDom 和 Microsoft.Data.Schema.ScriptDom.Sql,但是在 using 语句中它在“数据”上显示错误,因此无法获取 TSql100Parser类。 任何这样的类来验证 DB2 查询? TSql100Parser 是 Microsoft.SqlServer.TransactSql.ScriptDom.dll 的一部分 IScriptFragment 与较新的 VSBuilds 现在是 TSqlFragment【参考方案2】:

使用此提示将您的查询设置为 sql:

set PARSEONLY  on

它只是检查您的查询并返回,如下所示:

set PARSEONLY  on
select * from tablea

不返回异常。

虽然

set PARSEONLY  on
select * f rom tablea

返回

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'f'.

【讨论】:

好吧。但是这个会进行数据库调用,在客户端解析它并验证 SQL 文本。我想避免数据库调用。此外,DB2 SQL 有没有这样的选项?【参考方案3】:

如果您只想验证/解析一个 SELECT 语句,无论该 select 语句有多么“繁重”,我发现验证 select 语句的最佳和最快方法如下: - 在您的代码中创建 2 个选择语句(字符串),例如:

1) 您的有效选择语句:SELECT * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>> 2)创建类似的select语句如SELECT TOP 1 * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>> - 只解析/验证第二个,不管你有多少个连接,它都会在毫秒内解析它,例如:

SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn); 

try 

sqlConn.Open();
sqlParse.ExecuteNonQuery()

希望对您有所帮助!干杯!

【讨论】:

这要求您在查询成功时运行该查询。 OP 要求“从文本框中解析 SQL 文本并在发送执行之前验证其是否正确”-我理解下一个逻辑步骤是运行它,但您的方法不是 OP 所要求的【参考方案4】:

我认为这就是您要寻找的。 http://www.codeproject.com/KB/database/sqlvalidator.aspx

【讨论】:

这在 c# 中不容易使用 酷。但是有什么对 DB2 查询有用吗?

以上是关于使用 C# 进行查询验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 进行 XML 验证

使用数据注释在 c# 中进行数据验证

在 c# 中使用 *** 进行活动目录身份验证

使用 AWSSDK.S3 使用 C# 对 Amazon S3 存储桶进行身份验证

在 C# 中搜索 Active Directory 并使用当前用户进行身份验证

使用 mbedtls 生成的 RSA 签名,无法使用 C# (bouncycastle) 应用程序进行验证