我需要保存一个包含几列的记录列表。我有两种方法可以做到这一点。
我可以简单地创建该元素的列表并在代码中多次执行存储过程
foreach(TestInfo test in lstTestInfo) {//执行存储过程}
我可以构建一个字符串并将其发送到数据库,在那里我可以将其拆分并将其存储在临时表中,然后通过一次往返将其插入那里
虽然这不是一个严重的问题......我想要一些见解。谢谢!
我需要保存一个包含几列的记录列表。我有两种方法可以做到这一点。
我可以简单地创建该元素的列表并在代码中多次执行存储过程
foreach(TestInfo test in lstTestInfo) {//执行存储过程}
我可以构建一个字符串并将其发送到数据库,在那里我可以将其拆分并将其存储在临时表中,然后通过一次往返将其插入那里
虽然这不是一个严重的问题......我想要一些见解。谢谢!
把事情简单化。从您最容易以稳健方式实施的解决方案开始,我相信这是第一个。
然后您可以测试性能是否足够好,如果遇到问题,请重新考虑实现。
有两种方法可以查看它。1. 做容易的事 vs 2. 做正确的事?第一个选项很简单,但不是可以为您提供长期解决方案的选项。迟早你会意识到它没有提供正确的性能,它是最简单的方法。当您的用户很少并且在一台机器上设置所有内容时,这可能会很好。
然而,第二种方法不仅减少了电汇,还最大限度地减少了对数据库的调用。您正在谈论执行意味着将涉及连接的 SP。每次对 DB 的调用都是开销,我们应该尽量减少它。如果您有一个具有 n 层部署的负载平衡环境,如果您使用选项 #1,您将无法在另一台服务器上调用 DB。
我会选择选项 2。这将花费更多时间来实施,但以后会节省我的努力。
如果您尝试实施第二个选项,则字符串本身的长度可能会成为障碍。您发送的数据只有这么多。数据越少,您的解决方案就越有效。
对数据库进行多次调用(解决方案 1)也是一种开销。假设多个单元格依赖于其他单元格的更新,您也可能会弄乱事务。
自己决定,这是您需要做出的权衡。
我会保持简单,使用单个连接和命令来有效地传递数据。可以使用其他复杂的技术,但我认为不会提供太多好处并且会弄乱你的 sproc。
public void UpdateUserItems(Guid userId, string[] items)
{
using (SqlConnection conn = new SqlConnection("connectionstring..."))
{
using (SqlCommand cmd = new SqlCommand("Insert Into UserItems(UserId, Items) values (@UserId, @Items)"))
{
conn.Open();
cmd.Parameters.AddWithValue("@UserId", userId);
foreach(string item in items)
{
cmd.Parameters.AddWithValue("@Item", Item;
cmd.ExecuteNonQuery();
}
}
}
}
这是一个经常被问到的问题,并且有很多可能的答案。例如,您是否考虑过[多个可选参数?Joe Celko 的这篇文章涵盖了这个选项,还提供了 Erland Sommarskog 的“经典”文章的链接。