【发布时间】:2009-02-20 10:46:43
【问题描述】:
我的一位同事正在开发一个 .NET 应用程序。他需要为他的对象编写保存函数。
通常他会使用 SQL Server 中的存储过程来执行此操作,但有 40 列是一项艰巨的任务。
我们的其他几位同事更喜欢使用 XSD 进行数据库交互。
在处理大型记录时,怎样才能最大程度地兼顾工作量、可维护性和效率?
【问题讨论】:
标签: .net sql-server database
我的一位同事正在开发一个 .NET 应用程序。他需要为他的对象编写保存函数。
通常他会使用 SQL Server 中的存储过程来执行此操作,但有 40 列是一项艰巨的任务。
我们的其他几位同事更喜欢使用 XSD 进行数据库交互。
在处理大型记录时,怎样才能最大程度地兼顾工作量、可维护性和效率?
【问题讨论】:
标签: .net sql-server database
对我有用的一种方法是创建一个带有一个参数的存储过程 - 一个 xml 字符串。然后,您可以使用内置 sql 工具来 xpath 到字符串中的数据,或者只是将其解析出来。
假设你的 xml 看起来像这样:
<data>
<col1 value="myVal">
<col2 value="myVal2">
<col3 value="myVal3">
</data>
你的存储过程看起来像这样:
Create Procedure InsertData @xml xml
as
DECLARE @hDoc int
--Prepare input values as an XML documnet
exec sp_xml_preparedocument @hDoc OUTPUT, @xml
Insert Into MyTable(col1,col2,col3)
select col1,col2,col3
from OPENXML(@hdoc,'/data/')
WITH (col1 varchar(100) '/data/col1/@value', col2 varchar(100) '/data/col2/@value', col3 varchar(100) '/data/col3/@value')
EXEC sp_xml_removedocument @hDoc
GO
您可以在此处查看更多信息: http://technet.microsoft.com/en-us/library/ms187897.aspx
【讨论】:
XSD 不影响 app 和 db 之间的通信。 你用什么与db进行通信?数据适配器?您应该在命令中使用参数作为值。然后您可以使用直接表访问或存储过程。直接表访问速度更快,但 SP(通常)更可靠。
【讨论】:
我怀疑你在这里使用 ado.net。
如果您必须使用 SqlCommandBuilder 的惰性选项来自动创建插入、更新和删除语句。 SqlCommandBuilder 检查一个 SqlDataAdapter,该 SqlDataAdapter 设置有从单个表中选择的单个查询。查询甚至可以是一个选择 *
【讨论】:
这是没有真正答案的问题之一。
这取决于您当时想要达到的目标。
我通常会使用存储过程,因为我可以编写更少的代码行,而且我可以调整存储过程而无需重新构建或重新部署任何东西。如果我需要添加新字段,那么显然需要额外的代码。
如果速度成为问题,我可以探索更复杂的解决方案。
我喜欢 Brendan 提出的使用 XML 的建议,但是我认为我们可能会做很多工作来避免创建太多参数。我可以看到这将是处理我们达到某个极限之王的情况的一种非常好的方法。
【讨论】: