Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并/标记SQL命令的方法_C#_.net_Vb.net - Fatal编程技术网

C# 合并/标记SQL命令的方法

C# 合并/标记SQL命令的方法,c#,.net,vb.net,C#,.net,Vb.net,我想将一个“SELECT”SQL语句分解成它的逻辑组件。i、 我想创建一个像“SelectSqlStatement”这样的对象,它有一个名为“Table”、“Where”、“OrderBy”等的属性。我想这样做的原因是我不想操纵字符串,而是操纵一个对象并将其序列化回字符串 在我为.NET编写一个之前,我想知道是否有一个可用的。我搜索了一下,但什么也没看到。 仅举几个例子。你要找的是一个 *我可以很快找到VB的所有链接。TopCoder提供了一个非常强大的组件。我在一个真实的项目中使

我想将一个“SELECT”SQL语句分解成它的逻辑组件。i、 我想创建一个像“SelectSqlStatement”这样的对象,它有一个名为“Table”、“Where”、“OrderBy”等的属性。我想这样做的原因是我不想操纵字符串,而是操纵一个对象并将其序列化回字符串

在我为.NET编写一个之前,我想知道是否有一个可用的。我搜索了一下,但什么也没看到。

仅举几个例子。你要找的是一个


*我可以很快找到VB的所有链接。

TopCoder提供了一个非常强大的组件。我在一个真实的项目中使用了它(也是为TopCoder构建的),它工作得非常好。它的解析器语法非常复杂,超过一千行代码。重建它很可能会花费高昂的代价。

听起来您真的在寻找ORM(例如nHibernate)


否则SQL语法相当复杂。如果你真的想解析,那么你需要搜索BNF语法或者根据在线书籍中提供的内容滚动你自己的BNF。虽然微软的t-SQL确实存在标准SQL语法,但快速搜索并没有避开现有的语法。祝你一切顺利

您可以使用sql server的scriptdom解析器来实现这一点。 它位于Microsoft.SqlServer.Transact-SQL.ScriptDom.dll中,并为您提供构建tsql查询的TSqlFragment的ast

static void Main(string[] args)
{
    bool initialQuotedIdentifiers = false;
    TSqlParser parser = new TSql110Parser(initialQuotedIdentifiers);

    StreamReader sr = new StreamReader(@".\test.sql");
    IList<ParseError> errors;
    TSqlFragment fragment = parser.Parse(sr, out errors)

    //do stuff with the fragment

    //Generate tsql from the fragment
    StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
    Sql110ScriptGenerator scriptGen = new Sql110ScriptGenerator();
    scriptGen.GenerateScript(fragment, sw);
}
static void Main(字符串[]args)
{
bool initialQuoteIdentifiers=false;
TSqlParser parser=新的TSql110Parser(InitialQuoteIdentifiers);
StreamReader sr=新的StreamReader(@“\test.sql”);
IList错误;
TSqlFragment fragment=parser.Parse(sr,out错误)
//用碎片做东西
//从片段生成tsql
StreamWriter sw=新的StreamWriter(Console.OpenStandardOutput());
Sql110ScriptGenerator scriptGen=新的Sql110ScriptGenerator();
scriptGen.GenerateScript(片段,sw);
}

如果您想自己动手,我建议您与它的SQL语法一起使用,以方便解析和重建。把它的标记绑定到一个对象上,你就有了一个非常难看和沉重的SQL构建器。我绝对不想自己做:-)Hrmm,那会让事情变得复杂。然而,我确实相信nHibernate(承认它有最难进入的障碍)可以使用2.0。我编辑了我的答案,以包括一个先前的SO问题,专门针对.NET2.0