代码之家  ›  专栏  ›  技术社区  ›  Patrick angularsen

通用SQL生成器.NET

  •  7
  • Patrick angularsen  · 技术社区  · 14 年前

    我正在寻找一种用C语言编写SQL语句的方法,针对不同的提供程序。SQL语句区分的典型示例是 LIMIT in PostgreSQL VS TOP in MSSQL .

    是解决上述两种SQL语法的唯一方法,根据用户选择的提供程序或使用try catch语句作为流控制来编写if语句( 极限不起作用,我改穿上衣 )?我见过 LINQ Take 方法,但我想知道是否可以在不使用LINQ的情况下执行此操作?

    换言之,C是否有一些我找不到的通用SQL提供程序类可以使用?

    5 回复  |  直到 6 年前
        1
  •  7
  •   Joel Cunningham    14 年前

    实体框架能够针对不同的数据库。这将允许您编写两个数据库都可以使用的LINQ语句。您需要为实体框架找到一个PostgreSQL提供程序。有几种可供选择。

    希望这有帮助。

        2
  •  3
  •   Mark Byers    14 年前

    DBLinq :

    用于Oracle、PostgreSQL、MySQL、Ingres、SQLite、Firebird和…SQL Server(C 3.0)

    使用Linq to SQL生成查询时,可以查看并保存生成的SQL。

    但它不符合您的要求“不使用LINQ”。如果你有LINQ,为什么不使用它呢?

        3
  •  3
  •   Marc Tidd    14 年前

    我认为没有“通用SQL提供程序”。

    在我们的车间中,我们需要同时支持DB2和SQL Server,因此我们选择实现一个创建模型、数据访问和业务逻辑类的层模式。数据访问层处理到不同DBMS的连接,并加载将它们传递回业务逻辑的模型类。业务逻辑和模型类不知道数据访问层从何处获取数据。

    由于数据访问层调用数据库中的存储过程,所以会处理SQL中的差异。我们在两个系统中都使用适当的语法实现了存储过程。如果我们需要转到另一个数据库,我们所要做的就是在新的DBMS上实现必要的过程,并且一切都应该正常工作。

        4
  •  1
  •   rkellerm    14 年前

    加入Marc Tidd的想法- 如果不需要LINQ,请为每个提供程序创建单独的DAL类,或者使用将在每个DB上实现的存储过程。

        5
  •  0
  •   Serg046    6 年前

    出于某种原因,我不喜欢Linq作为查询接口,一段时间前开始创建一个SQL生成库。看看lambdasql。 目前,它包含 select 子句和 where 过滤器。已经支持设置字段,其中,group by,having,order by,join,嵌套查询。稍后将支持插入、更新和删除。它还包含一些扩展现有行为的点。例如 Limit 是用这种方式实现的。

    例子:

    var qry = new SqlSelect
    (
        new SqlSelect<Person>()
            .AddFields(p => p.Id, p => p.Name)
            .Where(SqlFilter<Person>.From(p => p.Name).EqualTo("Sergey"))
        , new SqlAlias("inner")
    ).AddFields<Person>(p => p.Name);
    
    Console.WriteLine(qry.ParametricSql);
    Console.WriteLine("---");
    Console.WriteLine(string.Join("; ", qry.Parameters
        .Select(p => $"Name = {p.ParameterName}, Value = {p.Value}")));
    

    输出:

    SELECT
        inner.Name
    FROM
    (
        SELECT
            pe.Id, pe.Name
        FROM
            Person pe
        WHERE
            pe.Name = @w0
    ) AS inner
    ---
    Name = @w0, Value = Sergey
    

    在这里看到更多 https://github.com/Serg046/LambdaSql