c#更新单个db字段还是整个对象?

c#更新单个db字段还是整个对象?,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,这似乎是一个奇怪的问题,但它已经困扰了我一段时间了。考虑到我不是一个经验丰富的程序员,而且我是公司里唯一的应用程序/c#开发人员,我觉得有必要和你们一起检查一下 我们已经创建了一个应用程序,在公司内部处理运输信息,该应用程序与IT办公室的中央数据库一起工作 我们最近将数据库从mysql切换到mssql,在转换过程中,我们决定放弃以前使用的Web服务,使用应用程序角色直接连接到数据库,为了增加安全性,我们只允许访问存储过程,所有CRUD操作都通过这些过程处理 但是,我们目前有用于更新其中一个对象中

这似乎是一个奇怪的问题,但它已经困扰了我一段时间了。考虑到我不是一个经验丰富的程序员,而且我是公司里唯一的应用程序/c#开发人员,我觉得有必要和你们一起检查一下

我们已经创建了一个应用程序,在公司内部处理运输信息,该应用程序与IT办公室的中央数据库一起工作

我们最近将数据库从mysql切换到mssql,在转换过程中,我们决定放弃以前使用的Web服务,使用应用程序角色直接连接到数据库,为了增加安全性,我们只允许访问存储过程,所有CRUD操作都通过这些过程处理

但是,我们目前有用于更新其中一个对象中的每个字段的存储过程,这是相当多的存储过程,因此在数据存储库的客户机上有相当多的工作(需要单独的代码来调用该过程并为每个过程传递正确的参数)

因此,我在想,如果在初始插入后,大量数据将一次更改一个字段,并且我们正试图降低网络使用率,因为一些客户端将在有限的互联网上运行,那么简单地更新整个对象(在本例中,一个对象表示一个表,例如发货)会更好吗


这种事情的标准做法是什么?还是有一种我忽略了的方法?

如果您知道更改的内容,最好只更新您更改的内容(例如,如果使用类似ORM的实体框架),但是如果您正在执行存储过程,那么是的,立即明确地更新行中的所有内容,这已经足够细化了


您应该将此开关作为切换到LINQ to entities的一个机会,但是,如果您已经在进行重大更改,并且尽可能在过程中放弃存储过程,那么更新整行的所有列是一种更常见的做法

如果每个字段都有一个proc,并且在一次更新中更改了多个字段,则必须将所有存储过程调用打包到一个事务中,以避免数据库进入不一致的状态。您还必须检测更改的字段(这意味着您需要将旧行与新行进行比较)


研究如何使用类似于对象关系映射器(ORM)的实体框架来实现这类操作。您会发现,对于ORMs是否是满足所有数据访问需求的最佳解决方案,目前还没有达成一致意见,但很难说它们能够非常全面地解决CRUD问题。

通过互联网直接连接到数据库并不是我会很快改用的

“我们决定放弃以前使用的Web服务,直接连接到数据库”

你是怎么决定的


如果您打算使用此模型,那么更新整行的单个存储过程将比每列一个存储过程更有利。我有一个类似的应用程序,它以这种方式使用存储过程,但是来自客户端的数据是通过XML输入的,然后我们服务器端的中间件应用程序处理数据库更新。

标准做法是而不是通过internet连接到数据库。 即使对于小型应用程序,这也应该是整体模型:

客户端应用程序->通过internet->服务器端应用程序(WCF WebService)->局域网/本地主机->SQL 分贝

好处:

  • 您的客户端应用程序甚至不知道您已经切换了DB实现
  • 它对数据库安全性等一无所知
  • 作为一名程序员,您不会考虑客户端的“行”和“列”。这些将是对象和字段
  • 您将能够使用不同的协议:在客户端应用程序和服务器应用程序之间只发送单个字段更新,但在服务器应用程序和数据库之间更新整个行

现在,考虑到您的情况,更新整行(整个对象)肯定比更新单个列更像是一种标准做法。

请注意,这是一个相对较小的应用程序,实体框架似乎有些过头了。你还说“在过程中尽可能地丢弃存储过程”为什么?实体框架并没有过分,新技术比旧技术更简单,也不比旧技术更复杂。我建议放弃存储过程的原因是因为它不太难维护,如果你是一个人,那么在你的情况下更是如此,一切都在LINQ中的代码中,没有与DBA同步的部署,没有源代码控制之外的sql语句等等。因为我转换到了实体框架/LINQ思维模式(回到linq到sql的早期),我不必输入超过几十行sql,我也不会错过它。我有一个负责数据库工作的人,因为我远非TSQL专家,他负责处理存储过程。我们在对以前的一些问题提出建议后使用了这些存储过程,增加了安全性,因为这些客户端通过internet(通过ssl)访问数据库这就是重点,实体框架消除了对数据库工作人员的需求,不要求您了解任何TSQL,并且将使您成为更好的C#程序员,因为linq到实体和linq到对象具有相似性,如果您学习两者,将很好地结合在一起。我认为直接在网络上公开您的数据库不是一个好主意然而,我肯定会违背你的决定(保留web服务,放弃存储过程,而不是你选择的oposite)现在,更新只能针对单个列,当文本框发生更改时,只需通过和事件调用它,在发送到存储过程之前,该更改的检测都是通过客户端完成的。我们这样做是因为在绝大多数情况下,任何时候都只能编辑单个字段。主由于这一变化减少了开发时间,web服务最初是作为一种安全工具存在的