如何将对名称的顺序列表的更改保存到sql数据库?

时间:2011-02-11 16:31:42

标签: .net sql sql-server-2008 lightspeed

好的,这是场景。我认为这很常见,而且我在以前的生活中使用蛮力方法解决了它,但我认为必须有更好的方法。

给定一个有序的名称列表,以及用户可以重新排序,删除,编辑和添加名称到列表的UI,您将如何更新存储在SQL数据库中的列表?

以下是表格定义:

CREATE TABLE [dbo].[AssyLines](
  [AssyLineID] [int] IDENTITY(1,1) NOT NULL,
  [ShortName] [varchar](16) NOT NULL,
  [LongName] [varchar](45) NOT NULL,
  [Seq] [tinyint] NOT NULL,
CONSTRAINT [PK_AssyLines] PRIMARY KEY CLUSTERED 

我想要做的是从表中读取所有条目,并在UI中以Seq顺序显示它们。然后,用户可以编辑ShortName或LongName,重新排序列表,添加新条目或删除现有条目,然后将修改后的列表保存回数据库。

这是一个客户端 - 服务器应用程序,如果这有任何区别。 WCF服务处理数据库交互,客户端只向服务提供一组记录。

我的暴力方法涉及锁定表,删除所有条目,然后将新记录重新写入表 - 当然,所有内容都使用存储过程以及表变量或临时表。粗暴但有效,但我不禁感到有一种相当标准的方法可以做到这一点,而无需在每次有人进行细微编辑时对表进行核对并重新创建。

有什么想法吗?我目前正在处理的应用程序中有4或5个这样的列表。

谢谢,戴夫

3 个答案:

答案 0 :(得分:0)

我不是.NET开发人员,但更优雅的方法是在桌面上安装3个侦听器;添加侦听器,更新侦听器和删除侦听器。侦听器将分别触发INSERT,UPDATE和DELETE。

对列表进行排序不会影响数据库中存储的数据。

答案 1 :(得分:0)

为什么不对每条记录(由AssyLineID标识,不应该更改)运行UPDATE查询,将其他列更新为用户指定的内容?无需删除任何内容,您可以通过跟踪用户更改的内容来减少数据库操作的数量。

如果您担心重新排序Seq部分,我认为这样可以解决这个问题:

if (newSeq < oldSeq)
{
    sql = "UPDATE AssyLines SET Seq = Seq + 1 WHERE Seq >= @seq AND Seq < @oldSeq AND AssyLineID <> @lineID";
}
else if (newSeq > oldSeq)
{
    sql = "UPDATE AssyLines SET Seq = Seq - 1 WHERE Seq <= @seq AND Seq > @oldSeq AND AssyLineID <> @lineID";
}

也许我不明白为什么你觉得你每次都需要核对桌子。这听起来像是Seq部分以外的基本选择 - 修改 - 保存操作。

答案 2 :(得分:0)

我将采用的方法是使用主键来对更改进行更新,插入和删除,并对数据进行一些传递。

  1. 将数据库中的列表加载到UI中,并将ID存储在项目中。另外,存储一个“已更改”标志,该标志最初设置为每个项目为false。
  2. 对UI中的数据进行任何更改,如下所示:
    • 通过添加数据添加数据,将ID(主键)设置为-1,将更改后的标志设置为true。
    • 通过编辑更新数据,将更改的标志设置为true。
    • 只需删除数据即可从数据中删除。
  3. 遍历列表中change flag = true的每个项目并执行以下操作:
    • 如果ID = -1,则使用INSERT添加新记录。
    • 如果ID&gt; -1,然后使用UPDATE更新与您要更新的记录匹配ID的现有记录。
  4. 然后重新读取数据库中存在的所有记录的ID,遍历每个记录并检查列表是否存在。如果没有,则使用DELETE将其从数据库中删除。
  5. 如果您有大量数据,第4步可能会变得非常慢。稍微不同的更有效的方式将取决于是否可以在UI中“标记”已删除的记录并将其从视图中隐藏而不删除它。然后,您可以使用设置为“I”,“U”或“D”的状态替换已更改的标志,具体取决于它是插入,更新还是删除。那么你只需要传递一次数据。