【问题标题】:Generic SQL builder .NET通用 SQL 构建器 .NET
【发布时间】:2011-02-25 15:58:13
【问题描述】:

我正在寻找一种在 C# 中针对不同提供者编写 SQL 语句的方法。区分 SQL 语句的典型示例是 LIMIT in PostgreSQLTOP in MSSQL

是解决上述两种 SQL 语法的唯一方法,根据用户选择的提供程序或使用 try catch 语句作为流控制来编写 if 语句(LIMIT 不起作用,我会尝试顶部代替)?我见过LINQ Take 方法,但我想知道如果没有 LINQ 是否可以做到这一点?

换句话说,C# 是否有一些我找不到可以使用的通用 SQL Provider 类?

【问题讨论】:

  • 为什么不想使用 LINQ?
  • 解决这些差异的方法有很多,您确定使用SQL 是解决问题的方法吗,即找到一些系统,让您编写一条SQL 语句可以跨不同的提供程序工作?
  • @Mark Byers:嗯,我发现自己经常以 .NET 2 为目标,据我所知,LINQ 在那里并不能很好地工作。从历史上看,这是因为我希望能够在没有任何模糊的情况下移植到 Mono,然后我就“卡住”了。由于现在 Mono 与 LINQ 配合得很好,我真的无法给出任何其他好的答案,为什么我仍然生活在过去..
  • @Lasse V. Karlsen:我如何不使用使用 SQL 语句从 C# 中的 SQL 数据库中获取数据?你有我可以解决差异的系统示例吗?
  • 不,我不是这个意思。您可以建立一个系统,在该系统中,您实际上必须编写两条 SQL 语句,每条语句都针对不同的数据库引擎进行了自己的优化,然后将其分层,这样使用它的代码就不需要知道哪个是目前正在使用。此处可以使用 IoC 容器或类似容器。但是,如果您想/需要采用一个针对不同提供程序的 sql 的方式,那么我已经走这条路,可能会为您提供一些代码。

标签: c# .net sql sqlbuilder


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    DBLinq

    适用于 Oracle、PostgreSQL、MySQL、Ingres、SQLite、Firebird 和 ... SQL Server (C# 3.0) 的 LINQ 提供程序

    当您使用 LINQ to SQL 生成查询时,可以查看生成的 SQL 并将其保存。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 哎呀,我的第一个反对票。解释将不胜感激。谢谢。
      • 所以基本上,实现你自己的? :-) 据我所知,存储过程不是数据库中的“标准”,尽管它减少了使用业务逻辑时可能发生的错误,这是一个很好的观点。我正在寻找一种方法来例如列出数据库中的表,然后从“任何数据库”中的特定表中获取列,在这种情况下,S.P. 并不是那么好的匹配。
      • 我明白了,您的问题没有详细说明“发现”数据库对象的要求,这远远超出了 SQL 实现的差异。感谢您的解释,我知道这不是您想要的,因此投反对票。
      • 我没有投反对票。我很欣赏这个答案,并认为考虑到我在问题中指定的要求,这是一个很好的答案。
      • @Patrick,我以为你是在回应我的澄清请求。无论如何感谢您的反馈。
      【解决方案4】:

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

      【讨论】:

      • 是的,解决SQL问题的主要思路是使用存储过程,如果它不适合您的解决方案,您不必经过全层模式。
      【解决方案5】:

      由于某种原因,我不喜欢 linq 作为查询接口,并且前段时间开始创建一个 sql 生成库。看看 LambdaSql。 目前它包含select 子句和where 过滤器的基本场景。已经支持设置字段、where、group by、have、order by、joins、嵌套查询。稍后将支持插入、更新和删除。它还包含一些扩展现有行为的要点。例如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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 2020-04-30
        • 2012-01-03
        相关资源
        最近更新 更多