设计问题 - 用c#更新几行 - 关注多次往返性能

时间:2010-12-07 21:14:36

标签: c# .net database web-services

我有一个现有的网站(基于.net 1.1),它调用web服务(基于.net 1.1)来访问数据。 Web服务调用存储过程来运行SQL。

我有一个带有多个子对象(注释)的父对象(字母)(5-25),我需要将每个子对象上的一列更新为一个新值 - 在注释上设置一个标志例如,将状态设置为已批准 - 此属性位于注释上,而不是字母上,因为稍后可以添加更多未批准的注释。

我们通常采用的方法是创建一个新的web方法,例如: ApproveComments并传递letterID,以便将当前信中的所有评论设置为已批准。然后调用ApproveCommentsOnLetter存储过程将ApprovedFlag更新为True,其中letterID =传入的参数。

这种方法意味着随着时间的推移,我们倾向于最终得到许多非常具体的Web服务调用和非常具体的存储过程,因为在系统的特定区域中添加了新功能。这项工作正常,但意味着我们总是在编写新代码,而我正在思考如何以不同的方式做事。我无法更改.net版本,因为目前这是一个很小的变化,但我正在考虑如何随着时间的推移不断更新这个应用程序。

我的想法是创建一个名为UpdateComments的更通用的web方法,该方法将用于评论的所有更新。我会将一个Comments对象数组传递给它,这将有get / set属性。在这种情况下,我将循环并将每个Status属性更新为True,然后再将它们发送到Web方法,但将来可以以类似的方式设置其他列,从而避免创建新的Web方法。

然后我在数据库部分磕磕绊绊。感觉下一步是拥有一个UpdateComment存储过程。然后,我必须多次调用,一次为每个评论依次更新。我担心为这些调用(当前为5-25)进行一些重复的数据库往返并不是非常有效,而且通常感觉不好。我可以看到的另一种方法是,这些“批量”更新可以追溯到具有专门用于一次更新给定属性的特定Web方法和存储过程,但后来我回到创建新的开始我们添加到前端的每个新功能的Web方法和存储过程。

我很感激有关如何处理这个的想法 - 我不能去添加.net /等的ORM /新版本所以需要考虑如何在技术范围内最好地解决这个问题我已经在使用中了。

3 个答案:

答案 0 :(得分:1)

  

下一步是使用UpdateComment存储过程。然后,我必须多次调用

就是这样 - 数据库不处理行集合,而web服务主要对行集合感兴趣。

如果您可以从存储过程转移到应用程序控制的数据修改,则没有任何内容表明您无法将多个更新语句打包到SqlCommand的文本中。

或者,如果那不是一个选项,那就没有什么说你不能在一次往返中多次调用存储过程。

答案 1 :(得分:1)

@Durator

如果我是你,我会继续沿着特定的方式调用Web服务,而不是试图进行通用的调用。它可能有点工作,但从长远来看,它可以得到回报,因为系统更易于维护,实际上你提供了一个以业务为中心的抽象层。也就是说,从业务流程的角度来看,流程是批准给定字母的注释。这样做的具体方法使其非常清晰并映射到业务流程。

现在就多次往返而言...... 您的Web服务可以接受一系列注释ID以及字母ID。这样,您就可以通过电话进行一次调用,其中包含您需要更新的字母ID和注释ID数组。

可以通过几种方式实现。 1.向你的存储过程发送用逗号分隔的id数组,并在sp中分割,分割id并进行更新。

如果您使用的是MS SQL Server 2008,则会有一个名为TableValueParameter或TVP的新变量类型。基本上,您可以向storped proc发送包含要发送的记录(列和行)的.NET DataTable,并在SP中将参数视为“表”,这样您就可以使用它来执行连接你的更新。

答案 2 :(得分:1)

乍一看,似乎每行拨打一个电话不是正确的方法 - 但我建议你试试看看。它当然是最简单的,你可能会发现,一旦你投入生产,没有用户感知的性能问题。