这可能看起来像一个奇怪的问题,但它现在已经困扰了我一段时间。鉴于我不是一个经验丰富的程序员,而且我是公司唯一的应用程序/ c#开发人员,我觉得有必要和你们一起检查这个问题。
我们创建了一个在公司内部处理运输信息的应用程序,该应用程序与我们IT办公室的中央数据库一起使用。
我们最近将数据库从mysql切换到mssql,在转换过程中我们决定放弃以前使用过的webservices并使用Application Role直接连接到数据库,为了增加安全性,我们只允许访问Store Procedures,所有CRUD操作都是通过这些处理。
然而,我们目前有用于更新我们的一个对象中的每个字段的存储过程,这是很多存储过程,因此在DataRepository的客户端上有相当多的工作(需要单独的代码来调用过程和为每个程序传递正确的参数。)
所以我想,简单地更新整个对象(在这种情况下,一个对象代表一个表,例如货物)会更好,因为很多数据会在一次改变一个字段后初始插入,我们正试图降低网络使用率,因为一些客户端将在有限的互联网上运行。
这种事情的标准做法是什么?还是有一种我忽略的方法?
答案 0 :(得分:0)
我想说更新整行的所有列是一种更常见的做法。
如果每个字段都有一个proc,并且在一次更新中更改了多个字段,则必须将所有存储过程调用包装到单个事务中,以避免数据库进入不一致状态。您还必须检测哪个字段已更改(这意味着您需要将旧行与新行进行比较)。
考虑使用像Entity Framework这样的对象关系映射器(ORM)进行这些操作。您会发现对于ORM是否是满足所有数据访问需求的出色解决方案尚无普遍共识,但很难说它们能够全面地解决CRUD问题。
答案 1 :(得分:0)
通过互联网直接连接到数据库并不是我匆忙切换到的东西。
"我们决定放弃以前使用的网络服务并直接连接到数据库"
是什么让你决定这个?
如果您打算使用此模型,那么更新整行的单个SPROC将优于每列一个。我有一个类似的应用程序以这种方式使用SPROC,但是来自客户端的数据来自XML,然后我们服务器端的中间件应用程序处理更新数据库。
答案 2 :(得分:0)
标准做法是不通过互联网连接到数据库。 即使对于小应用程序,这应该是整体模型:
客户端应用 - >在互联网上 - >服务器端应用程序(WCF WebService) - > LAN / localhost - > SQL DB
优点:
现在,根据您的情况,更新整行(整个对象)肯定比更新单个列更符合标准做法。
答案 3 :(得分:-1)
如果您知道更改的内容(例如,如果使用类似实体框架的ORM),那么只更新您更改的内容会更好,但是如果您按照存储的proc路线进行更改,那么肯定会更新这一切都是一次性的,这种方式非常精细。
你应该把交换机作为一个机会来切换到LINQ到实体,但是如果你已经进行了大的改变并尽可能地在程序中抛弃了存储过程