0

我需要保存一个包含几列的记录列表。我有两种方法可以做到这一点。

  1. 我可以简单地创建该元素的列表并在代码中多次执行存储过程

    foreach(TestInfo test in lstTestInfo) {//执行存储过程}

  2. 我可以构建一个字符串并将其发送到数据库,在那里我可以将其拆分并将其存储在临时表中,然后通过一次往返将其插入那里

虽然这不是一个严重的问题......我想要一些见解。谢谢!

4

5 回答 5

3

把事情简单化。从您最容易以稳健方式实施的解决方案开始,我相信这是第一个。

然后您可以测试性能是否足够好,如果遇到问题,请重新考虑实现。

于 2011-09-06T06:46:32.470 回答
1

有两种方法可以查看它。1. 做容易的事 vs 2. 做正确的事?第一个选项很简单,但不是可以为您提供长期解决方案的选项。迟早你会意识到它没有提供正确的性能,它是最简单的方法。当您的用户很少并且在一台机器上设置所有内容时,这可能会很好。

然而,第二种方法不仅减少了电汇,还最大限度地减少了对数据库的调用。您正在谈论执行意味着将涉及连接的 SP。每次对 DB 的调用都是开销,我们应该尽量减少它。如果您有一个具有 n 层部署的负载平衡环境,如果您使用选项 #1,您将无法在另一台服务器上调用 DB。

我会选择选项 2。这将花费更多时间来实施,但以后会节省我的努力。

于 2011-09-06T06:55:42.963 回答
1

如果您尝试实施第二个选项,则字符串本身的长度可能会成为障碍。您发送的数据只有这么多。数据越少,您的解决方案就越有效。

对数据库进行多次调用(解决方案 1)也是一种开销。假设多个单元格依赖于其他单元格的更新,您也可能会弄乱事务。

自己决定,这是您需要做出的权衡。

于 2011-09-06T07:08:10.287 回答
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();
            }
        }
    }
}
于 2011-09-06T07:31:57.117 回答
1

这是一个经常被问到的问题,并且有很多可能的答案。例如,您是否考虑过[多个可选参数?Joe Celko 的这篇文章涵盖了这个选项,还提供了 Erland Sommarskog 的“经典”文章的链接。

于 2011-09-06T09:30:46.153 回答