C# 使用C语言进行查询验证

C# 使用C语言进行查询验证,c#,sql,sql-server,db2,C#,Sql,Sql Server,Db2,我正在寻找一个C语言的查询验证器,它允许我解析文本框中的SQL文本,并在发送它执行MS SQL或DB2查询之前验证它是否正确。我想这就是您要寻找的 如果希望在不使用数据库的情况下验证SQL语法,则该类在这种情况下会做得很好 免责声明,这里的代码借用自本文 不过使用起来非常简单。如果它返回null,则在解析它时没有错误 using Microsoft.Data.Schema.ScriptDom; using Microsoft.Data.Schema.ScriptDom.Sql; public

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

我想这就是您要寻找的

如果希望在不使用数据库的情况下验证SQL语法,则该类在这种情况下会做得很好

免责声明,这里的代码借用自本文

不过使用起来非常简单。如果它返回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;
        }
}

使用以下提示将查询设置为sql:

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

set PARSEONLY  on
select * from tablea
不返回任何异常

返回

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

如果您只想验证/解析SELECT语句,而不管该SELECT语句的负载有多重,我发现验证SELECT语句的最佳和最快方法如下: -在代码中创建2个select语句字符串,例如:

1您的有效select语句:从大型\u表中选择*连接多个\u表,其中 2创建一个类似的select语句,如select TOP 1*FROM MARGE_TABLE JOIN多个_TABLE,其中 -仅解析/验证第二个连接,无论其中有多少个连接,它都将以毫秒为单位对其进行解析,例如:

SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn); 

try 
{
sqlConn.Open();
sqlParse.ExecuteNonQuery()
}

希望有帮助!干杯

MS SQL-是最好的查询验证程序。将查询发送到它,如果查询错误,它将引发异常:同样,同一查询对于一个DB引擎可能是正确的,而对于另一个DB引擎可能是不正确的。为什么不让DB引擎验证呢?MS SQL上的ExecuteSQL会对无效查询抛出异常,但潜在的危害在于这些查询将被触发,而我的唯一目的是测试语法。在DB2的情况下呢?什么开销?DB查询验证是查询工作流中最早的步骤之一。它不仅会验证语法,还会检查表或列是否存在以及诸如此类的内容。这在cCool中不容易使用。但是有什么对DB2查询有用的东西吗?我遗漏了什么吗?我无法获取Microsoft.Data的引用。我正在使用VS2010@Kunal您必须右键单击引用并将此引用添加到项目中,然后才能执行using语句来包含它。我已经添加了引用Microsoft.Data.Schema.ScriptDom和Microsoft.Data.Schema.ScriptDom.Sql,但在使用语句时,它显示了数据错误,因此无法获取TSql100Parser类。任何此类类都可以验证DB2查询吗?TSql100Parser是Microsoft.SqlServer.Transact-SQL.ScriptDom.dll IScriptFragment的一部分,具有较新版本的VSBuild现在是TSqlFragmentWell。但这个将进行一个DB调用,在客户端解析它并验证SQL文本。我想避免数据库调用。另外,DB2SQLS是否有这样的选项?如果查询成功,则需要运行查询。OP要求解析textbox中的SQL文本,并在发送执行之前验证其是否正确-我理解下一个逻辑步骤是运行它,但OP要求的不是您的方法
SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn); 

try 
{
sqlConn.Open();
sqlParse.ExecuteNonQuery()
}