2011-06-09 37 views
14

我正在寻找c#中的查询验证程序,它允许我在发送文本框之前解析SQL文本并验证其正确与否,然后将其发送执行。 (MS SQL或DB2查询)。使用c#进行查询验证

+1

MS SQL - 是最好的查询验证器。发送查询到它,它会抛出异常是查询是错误的。 :)另外,对于一个数据库引擎而言,相同的查询可能是正确的,而对另一个数据库则不正确为什么不让DB引擎验证? – 2011-06-09 03:40:50

+0

MS SQL上的ExecuteSQL会在无效查询时抛出异常,但潜在的危害在于这些查询会被解雇,因为我唯一的目的是测试语法。什么是DB2的情况? – Cannon 2011-06-09 03:43:23

+0

什么开销?数据库查询验证是查询工作流程中的第一步。它不仅会验证语法,还会检查表或列是否存在以及所有类似的事情。 – 2011-06-09 03:45:12

回答

25

如果您希望验证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; 
     } 
} 
+0

我错过了什么吗?我无法获得Microsoft.Data的引用。我正在使用VS2010 – Cannon 2011-06-09 04:21:28

+0

@Kunal您必须右键单击引用并将此引用添加到您的项目,然后才能使用声明来包含它。 – 2011-06-09 04:29:42

+0

以及我已经添加了两个引用Microsoft.Data.Schema.ScriptDom和 Microsoft.Data.Schema.ScriptDom.Sql,但在使用语句时,它显示“数据”错误,因此无法获取TSql100Parser类。 – Cannon 2011-06-09 04:39:16

6

设置查询与此提示

集PARSEONLY上 它只是检查您的查询,SQL和上 SELECT *返回

这样

集PARSEONLY从表A

也没有例外

集PARSEONLY上 选择* F ROM表A

回报

消息102,级别15,状态1,2号线 附近有语法错误 'F'。

+0

那么。但是这个会调用数据库,在客户端解析它并验证SQL文本。我想避免数据库调用。此外,DB2 SQL的任何此类选项? – Cannon 2011-08-07 04:47:17

+0

那是我知道的方式 – DeveloperX 2011-08-09 13:23:56

1

如果你想验证/解析一个SELECT语句,不管select语句的“重载”是什么,我发现验证select语句的最好和最快的方法如下: - 在你的代码中创建2个select语句(串),如:

1)本人有效select语句: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() 
} 

希望它有帮助!干杯!

+0

不适用于UPDATE和INSERT或DELETE? – 2017-09-29 00:41:25

+0

这需要您运行查询,如果其成功。 OP要求“在解析文本框中的SQL文本并在发送它执行前验证其正确与否” - 我理解下一个逻辑步骤是运行它,但您的方法不是OP要求的 – Sam 2018-03-08 18:40:24