使用 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# 进行查询验证的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWSSDK.S3 使用 C# 对 Amazon S3 存储桶进行身份验证