将对象列表的数据升级到数据库

时间:2011-08-24 18:41:51

标签: c# asp.net sql-server sql-server-2008

通常,我发现自己需要将用户更新的记录集合发送到存储过程。例如,假设数据库中有联系人表。在前端,我显示让10个联系人记录供用户编辑。用户进行更改并点击保存。

此时,我可以在循环中使用用户修改的数据调用我的upsertContact存储过程10次,或者将格式为<contact><firstname>name</firstname><lastname>lname</lastname></contact>的XML与所有10一起发送到存储过程。我总是最终做xml。

有没有更好的方法来实现这一目标。如果由于大小而存在大量记录,则xml方法是否会中断。如果是这样,人们如何实现这种功能呢?

仅供参考,它通常不仅仅是直接表更新,所以我没有查看sqldatasource。

更改:根据请求,到目前为止的版本是SQL 2005,但我们现在正在升级到2008。因此,欢迎任何新功能。感谢。

更新:根据this文章和下面的反馈,我认为表值参数是最佳选择方法。此外,使用TVP,sql 2008的新merge功能非常酷。

4 个答案:

答案 0 :(得分:4)

什么版本的SQL Server?您可以在SQL Server 2008+中使用表值参数...它们非常强大,即使它们是只读的并且比XML更麻烦,并且比转换为ORM(恕我直言)更麻烦。点击以下资源:

MSDN:表值参数:

http://msdn.microsoft.com/en-us/library/bb510489%28SQL.100%29.aspx

Erland Sommarskog在SQL Server 2008 /表值参数中的数组和列表:

http://www.sommarskog.se/arrays-in-sql-2008.html#TVP_in_TSQL

答案 1 :(得分:0)

我认为直接操纵数据库中的XML会比去那条路线更麻烦;我建议改为按照你的建议将每个电话分开; 10个电话保存每个联系人。

这种方法和缺点有好处;显然,您必须创建数据库连接。但是,您可以简单地排队一组命令以在一个连接上发送。

答案 2 :(得分:0)

Sql Server XML数据类型与VARCHAR(MAX)相同,因此需要一个非常大的变更集才能使其中断。

我在保存XML请求和响应时使用过类似的方法,但没有发现任何问题。不确定它是否是“最佳”解决方案,但“最佳”始终是相对的。

答案 3 :(得分:0)

听起来您可以使用Object-Relational-Management(ORM)NHibernatethe Entity Framework解决方案。这些解决方案使您能够对对象进行更改,并使更改由ORM提供程序传播到数据库。这使得它们比向数据库发布自己的sql语句更灵活。他们还进行了优化,例如通过单个连接在单个事务中发送所有更改。