C#:SQL查询生成器类

问题描述:

我在哪里可以找到一个好的SQL查询生成器类。我只需要一个简单的类来构建一个SQL字符串,就是这样。我将需要它用于C#和MySql。我真的不需要像Linq或NHibernate这样的东西。谢谢C#:SQL查询生成器类

+0

当你的意思是SQL查询生成器类,你有什么期待这个类呢? – Jethro

+1

我期待类生成一个SQL字符串。类似于这个类http://www.codeproject.com/KB/database/SelectQueryBuilder.aspx?msg=2461496 – Luke101

你可以使用框架类CommandBuilder。退房:

http://msdn.microsoft.com/en-us/library/tf579hcz.aspx

如果您使用的是.NET 4,不介意使用动态可以使用Massive,通过罗布科纳创建的,这个单一文件数据库不需要的DLL,只是下降的Massive.cs文件,你准备好了。

您可以使用Massive来构建像这样的查询。

//grab all the products 
var products = table.All(); 
//Or 
var productsFour = table.All(columns: "ProductName as Name", where: "WHERE [email protected]",args: 4); 

根据需要还可以运行即席查询:

var result = tbl.Query("SELECT * FROM Categories"); 
+0

您好Jethro,我查看了文档,并没有看到它支持MySql。你知道他们是否支持MySql? – Luke101

+0

@ Luke101,似乎原来的Massive不支持MySql,但如果你检查这个链接http://nyqui.st/massive-data-access-for-mysql,你会看到有人已经添加了使用的功能MySQL的。 :)您可以使用NuGet并查找Massive.MySql – Jethro

我用这个code..It逃脱串过我希望它能帮助:

class Mysql 
{ 
    public static string INSERT(string INTO, NameValueCollection VALUES) 
    { 
     string queryString = "INSERT INTO " + INTO + " ("; 
     for (int i = 0; i < VALUES.Count; i++) 
     { 
      queryString += VALUES.Keys[i] + (i + 1 == VALUES.Count ? "" : ","); 
     } 
     queryString += ") VALUES ("; 

     for (int i = 0; i < VALUES.Count; i++) 
     { 
      queryString += Escape(VALUES[VALUES.Keys[i]]) + (i + 1 == VALUES.Count ? ("") : (",")); 
     } 
     queryString += ");"; 
     return queryString; 
    } 
    public static string DELETE(string FROM, NameValueCollection WHERE) 
    { 

     string queryString = "DELETE FROM " + FROM + " WHERE"; 
     for (int i = 0; i < WHERE.Count; i++) 
     { 
      queryString += " " + WHERE.Keys[i] + "=" + Escape(WHERE[WHERE.Keys[i]]); 

     } 

     queryString += ";"; 
     return queryString; 
    } 
    public static string UPDATE(string UPDATE, NameValueCollection SET, NameValueCollection WHERE) 
    { 

     string queryString = "UPDATE " + UPDATE + " SET"; 
     for (int i = 0; i < SET.Count; i++) 
     { 
      queryString += " " + SET.Keys[i] + "=" + data.Escape(SET[SET.Keys[i]]) + (i + 1 == SET.Count ? ("") : (",")); 

     } 
     queryString += " WHERE"; 
     for (int i = 0; i < WHERE.Count; i++) 
     { 
      queryString += " " + WHERE.Keys[i] + "=" + data.Escape(WHERE[WHERE.Keys[i]]); 

     } 
     queryString += ";"; 
     return queryString; 

    } 
    public static string SELECT(string[] SELECT, string FROM, NameValueCollection WHERE) 
    { 

     string queryString = "SELECT "; 

     for (int i = 0; i < SELECT.Length; i++) 
     { 
      queryString += SELECT[i] + (i + 1 == SELECT.Length ? ("") : (",")); 

     } 
     queryString += " FROM " + FROM + " WHERE "; 
     for (int i = 0; i < WHERE.Count; i++) 
     { 
      queryString += " " + WHERE.Keys[i] + "=" + Escape(WHERE[WHERE.Keys[i]]); 

     } 

     queryString += ";"; 
     return queryString; 

    } 
    public static string Escape(string input) 
    { 
     using (var writer = new StringWriter()) 
     { 
      using (var provider = CodeDomProvider.CreateProvider("CSharp")) 
      { 
       provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, null); 
       return writer.ToString(); 
      } 
     } 
    } 
} 

您使用它是这样的:

 NameValueCollection nvc_for_SET_and_VALUES=new NameValueCollection(); 
     NameValueCollection nvc_for_WHERE= new NameValueCollection(); 
     nvc_for_WHERE.Add("arg1","value1"); 
     nvc_for_WHERE.Add("AND arg2","value2"); 
     nvc_for_WHERE.Add("OR arg2","value3"); 
     nvc_for_SET_and_VALUES.Add("arg", "value"); 
     nvc_for_SET_and_VALUES.Add("arg2", "value2"); 
     string[] fieldsToSelect= { "arg1", "arg2" }; 
     Mysql.DELETE("mytable", nvc_for_WHERE); 
     Mysql.INSERT("mytable", nvc_for_SET_and_VALUES); 
     Mysql.SELECT(fieldsToSelect, "mytable", nvc_for_WHERE); 
     Mysql.UPDATE("mytable", nvc_for_SET_and_VALUES, nvc_for_WHERE); 
+1

我几乎在哭,不要使用字符串连接来构建查询,而是使用Command和Parameter对象。这是SQL注入的一个可能的漏洞。 http://www.imperva.com/resources/glossary/sql_injection.html –

+1

这段代码声称是从SQL注入攻击中消毒,但我一点也不确定这种消毒是如何工作的。我没有看到如何从参数中建立一个C#表达式,然后通过CodeDom运行它使它变得有益。 –

*·哈迪,W第i个DbExtensions您的样品可以是这样的:

public static string InsertQuery(string into, NameValueCollection values) 
    { 
     var query = SQL 
      .INSERT_INTO(into + " (" + 
         String.Join(" ,", values.Keys.Cast<String>().ToArray()) + 
         ")") 
      .VALUES(values.Keys.Cast<String>().Select(key => values[key])); 

     return query.ToString(); 
    } 

由于谷歌使我这个网页, 我建议SqlKata,一个简单但功能强大的SqlQuery类生成器,即支持嵌套有条件的地方,子查询和连接。

目前,它拥有SQLSERVER,MySQL和PostgreSQL

编译器
var query = new Query("Users") 
    .LeftJoin("Countries", "Users.CountryId", "Countries.Id") 
    .Where("Status", "blocked") 
    .OrWhereIn("Id", new [] {10, 11, 12}) 
    .OrWhere("LastLogin", ">", DateTime.UtcNow.AddMonths(-5)); 
+0

这是一个有趣的智力练习,但我想知道为什么要这样做,而不是直接写参数化的SQL。 –

+0

@RobertHarvey处理对象比处理字符串要容易得多,你也可以从数据库抽象层受益,例如检查http://sqlkata.vivida-apps.com/?sql--sqlsrv#offset和http:/ /sqlkata.vivida-apps.com/?sql--mysql#offset – amd