parsingC#中的SQL代码
我想用C#parsingSQL代码。
具体来说,有没有免费的parsing器可以parsingSQL代码,并生成一个树或任何其他结构呢? 它也应该为嵌套结构生成适当的树。
它也应该返回这棵树的节点所代表的那种语句。
例如,如果节点包含一个循环条件,那么它应该返回,这是一个节点的“循环types”。
或者有什么办法可以parsingC#中的代码并生成一个我想要的types的树?
使用Microsoft entity framework (EF)。
它有一个“实体SQL”分析器,它build立一个expression式树,
using System.Data.EntityClient; ... EntityConnection conn = new EntityConnection(myContext.Connection.ConnectionString); conn.Open(); EntityCommand cmd = conn.CreateCommand(); cmd.CommandText = @"Select t.MyValue From MyEntities.MyTable As t"; var queryExpression = cmd.Expression; .... conn.Close();
或者类似的东西,请在MSDN上查看。
这一切都在鲍尔默勾号:-)
代码项目中还有一个SQLparsing器 。
祝你好运。
Scott Hanselman最近推出了Irony项目 ,其中包含一个示例SQLparsing器。
特别是对于Transact-SQL(Microsoft SQL Server),您可以使用Microsoft.SqlServer.Management.SqlParser.Parser
提供的Microsoft.SqlServer.Management.SqlParser.Parser
命名空间 ,这是SQL Server随附的一个程序集,可以自由分发。
以下是一个将T-SQLparsing为一个令牌序列的示例方法:
IEnumerable<TokenInfo> ParseSql(string sql) { ParseOptions parseOptions = new ParseOptions(); Scanner scanner = new Scanner(parseOptions); int state = 0, start, end, lastTokenEnd = -1, token; bool isPairMatch, isExecAutoParamHelp; List<TokenInfo> tokens = new List<TokenInfo>(); scanner.SetSource(sql, 0); while ((token = scanner.GetNext(ref state, out start, out end, out isPairMatch, out isExecAutoParamHelp)) != (int)Tokens.EOF) { TokenInfo tokenInfo = new TokenInfo() { Start = start, End = end, IsPairMatch = isPairMatch, IsExecAutoParamHelp = isExecAutoParamHelp, Sql = sql.Substring(start, end - start + 1), Token = (Tokens)token, }; tokens.Add(tokenInfo); lastTokenEnd = end; } return tokens; }
请注意, TokenInfo
类只是一个具有上述属性的简单类。
Tokens
是这个枚举:
- 令牌枚举(Microsoft.SqlServer.Management.SqlParser.Parser)
并包含常量,如TOKEN_BEGIN
, TOKEN_COMMIT
, TOKEN_EXISTS
等
试试ANTLR – 那里有一堆SQL语法。
您可以查看一个商业组件: http ://www.sqlparser.com上的general sql parser它支持Oracle,T-SQL,DB2和MySQL的SQL语法。
VSTS 2008数据库版本GDR包含处理SQLparsing和脚本生成的程序集,可以从项目中引用。 Database Edition使用parsing器parsing脚本文件以表示数据库的内存模型,然后使用脚本生成器从模型生成SQL脚本。 我认为只有两个程序集需要在项目中引用。 如果您没有数据库版本,则可以安装试用版来获取程序集,或者可能有另一种方法在没有安装数据库版本的情况下拥有它们。 看看下面的链接。 数据老兄:进入皇冠珠宝 。
试试GOLD Parser ,这是一个强大而易学的BNF引擎。 您可以search已经为您想要的语法(即: SQL ANSI 89语法 )而创build的语法 。
我开始使用这个HQLparsing(NHibernate的查询语言,非常类似于SQL),这真棒。
更新:现在NH开发团队已经完成了使用ANTLR的HQLparsing(这是难以使用,但更强大的AFAIK)。
正如迭戈build议,语法是去恕我直言的方式。 我以前试过Coco / r,但是对于复杂的SQL来说太简单了。 有一些 ANTLR准备好了一些语法 。
有人甚至试图build立一个SQL引擎,检查代码,如果有什么在SharpHSQL你用C#编写的SQL引擎 。