当前位置: 首页 > 知识库问答 >
问题:

C#. NET组织SQL查询并拥有干净代码的最佳方法是什么

商华藏
2023-03-14

我和我的同事面临一个问题。我们有几个SQL查询作为字符串。下面是一个例子:

    public class Query
{

    public static string CreditTransferId(string expectedValue, string table, int statusId, int messageTypeId, int destination103, int destination202, string StoreStatus202Id)
    {
        return $"SELECT top 1 Id from {table} where MessageId = '{expectedValue}' and FlowId=3 and StatusId={statusId} and MessageTypeId={messageTypeId} and " +
          $" Destination103={destination103} and Destination202={destination202} and StoreStatus103Id is null and StoreStatus202Id {StoreStatus202Id}";
    }
}

目前,我们将它们作为字符串从查询类中的方法返回。我们希望重构代码,使其干净,因为我们有一个方法有3个以上的参数,这是很难使用的任何方式。

你会怎么做?组织需要大量参数的SQL查询的最干净的方法是什么?我非常感谢任何可能改善我们代码当前状态的答案。

谢谢

共有2个答案

杨选
2023-03-14

EF很棒,你必须决定这是否是你想要的。在某些情况下,这是不合适的。如果你决定坚持使用纯文本查询,那么把查询分成几个部分如何:FromBuilder JoinBuilder GroupBuilder Condition builder等等

前:

return @"
"+new TableIdSelectorBuilder(table).Get() +@"
"+new FromBuilder().Get(table) +@"
"+new TableConditionByIdBuilder(table).Get(I'd)+@"
";

编辑:存储过程允许在不发布新应用程序版本的情况下更改查询,但在活体上工作有点麻烦。至少有时候是这样。

胡俊贤
2023-03-14

动态SQL是一个非常糟糕的开始,因为这些是开放SQL注入,您应该使用参数化查询并返回一个字符串。

"例如:从[表]中选择顶部1 id,其中[MessageId]=@MessageId"etc

因此,您不需要传入任何值,您可以将这些值添加到SQLParameter的列表中

表名可能毫无意义,因为它与sql有关,所以可能只需将其添加到sql字符串中即可

这实际上不需要额外的类,只需在调用它的地方创建sql变量,如果需要的话,它就在那里?

…或者使用存储过程

…或使用实体框架

 类似资料:
  • 问题内容: 我正在尝试建立一个表,该表链接来自不同表的两个记录。这些链接本身需要与另一个表相关。因此,目前,我的表格如下所示: 但是,项目之间的链接不是定向的(即,项目是链接中列出的第一项还是第二项都没有关系)。理想情况下,我希望item_id字段只出现两次;因为它是我必须要小心,始终检查是否有重复项,以确保如果已经存在14到12,则永远不会创建将12到14链接的记录。 是否有一个优雅的数据库设计

  • 问题内容: 那就是我的做法: 有什么好处吗?如何避免那些意粉般的代码? 问题答案: 检出异步库,它用于控制流(异步内容),并且它有很多用于数组内容的方法:每种方法,过滤器,映射。查看github上的文档。这可能是您需要的: 每个(arr,迭代器,回调) 将迭代器函数并行应用于数组中的每个项目。调用迭代器时,将使用列表中的项目以及完成时的回调。如果迭代器将错误传递给此回调,则该函数的主回调将立即被错

  • 我正在使用java servlet编写一个简单的服务器。为了从数据库中获取数据,我编写了一个特殊的Dao层类,我想知道我应该在哪里存储SQL查询? 我需要创建一个特殊的类,将查询存储为最终字符串,还是有更有效的方法来实现?

  • 问题内容: 我试图通过C#中的代码找到最佳的(快速与最简单)访问SQL Server代码的方法。 当我从书本上学习时,我遇到了很多建议,通常都建议我通过拖放来完成。但是,由于我想在代码中做到这一点,所以第一种方法是按列号获取数据,但是SQL Query中的任何重新排序(如添加/删除列)都让我难以解决。 例如(别笑,有些代码大约有2年历史了),我什至编写了特殊的函数来传递sqlQueryResult

  • null field2和field3为空的所有字段 所有field2为空、field3为值的字段 所有field3为空、field2为值的字段 到目前为止,我已经使用了三个与UNION连接的查询 我自己觉得这是很多必要的代码来得到它的秩序,并希望有一个更好的解决方案。 那么有没有更好的办法呢?

  • 我有一个Excel文件,上面有一长串用户名。ColA包含旧用户名ColB包含新用户名。我想在基于excel文件的SQL表中重命名用户。我的问题是:在循环中使用using语句多次调用SQL可以吗?还是有更好的方法,我打开一个连接,让所有的SQL更新查询“一”?