好的,这是场景。我认为这很常见,而且我在以前的生活中使用蛮力方法解决了它,但我认为必须有更好的方法。
给定一个有序的名称列表,以及用户可以重新排序,删除,编辑和添加名称到列表的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个这样的列表。
谢谢,戴夫
答案 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)
我将采用的方法是使用主键来对更改进行更新,插入和删除,并对数据进行一些传递。
如果您有大量数据,第4步可能会变得非常慢。稍微不同的更有效的方式将取决于是否可以在UI中“标记”已删除的记录并将其从视图中隐藏而不删除它。然后,您可以使用设置为“I”,“U”或“D”的状态替换已更改的标志,具体取决于它是插入,更新还是删除。那么你只需要传递一次数据。