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

.net 如何将对顺序名称列表的更改保存到sql数据库?,.net,sql,sql-server-2008,lightspeed,.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] [var

好的,下面是场景。我认为这很常见,我在前世用蛮力的方法解决了它,但我认为必须有更好的方法

给定一个有序的名称列表,以及用户可以在其中重新排序、删除、编辑和向列表中添加名称的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中按顺序显示它们。然后,用户可以编辑ShortName或LongName,对列表重新排序,添加新条目或删除现有条目,然后将修改后的列表保存回数据库

这是一个客户机-服务器应用程序,如果这有什么区别的话。WCF服务处理数据库交互,客户机只是向服务发送一个记录数组,从服务发送一个记录数组

我的暴力方法包括锁定表、删除所有条目,然后将新记录重新写入表中——当然,所有这些都在事务内部,使用存储过程和表变量或临时表。虽然粗糙但有效,但我还是忍不住觉得有一种相当标准的方法可以做到这一点,而不必在每次有人进行小编辑时对表格进行核处理和重新创建

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


谢谢,Dave,我不是.NET开发人员,但是有一个更优雅的方法可以做到这一点,那就是在桌面上有3个侦听器;添加侦听器、更新侦听器和删除侦听器。侦听器将分别触发插入、更新和删除


对列表进行排序对存储在数据库中的数据没有影响。

我不是.NET开发人员,但更优雅的方法是在表中有3个侦听器;添加侦听器、更新侦听器和删除侦听器。侦听器将分别触发插入、更新和删除


对列表进行排序对存储在数据库中的数据没有影响。

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

如果您担心重新排序
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";
}
if(newSeq=@Seq和Seq<@oldSeq和AssyLineID@lineID”;
}
else if(newSeq>oldSeq)
{
sql=“UPDATE AssyLines SET Seq=Seq-1,其中Seq@oldSeq和AssyLineID@lineID”;
}

也许我不明白你为什么每次都要用核弹炸桌子。这听起来像是除了Seq部分之外的基本select modify save操作。

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

如果您担心重新排序
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";
}
if(newSeq=@Seq和Seq<@oldSeq和AssyLineID@lineID”;
}
else if(newSeq>oldSeq)
{
sql=“UPDATE AssyLines SET Seq=Seq-1,其中Seq@oldSeq和AssyLineID@lineID”;
}

也许我不明白你为什么每次都要用核弹炸桌子。这听起来像是除了Seq部分之外的基本select-modify-save操作。

我将采用的方法是使用主键将更新、插入和删除绑定到更改中,并对数据进行几次传递

  • 将列表从数据库加载到UI中,并针对该项存储ID。此外,存储一个“已更改”标志,该标志最初为每个项目设置为false
  • 对UI中的数据进行如下更改:
    • 通过添加它们,将ID(主键)设置为-1,并将更改的标志设置为true,来添加数据
    • 通过编辑数据并将更改标志设置为true来更新数据
    • 只需删除数据即可将其从数据中删除
  • 遍历列表中更改标志为true的每个项目,并执行以下操作:
    • 如果ID=-1,则使用INSERT添加新记录
    • 如果ID>-1,则根据要使用更新更新的记录更新与ID匹配的现有记录
  • 然后重新读取数据库中存在的所有记录的ID,循环遍历每个记录,并检查列表是否存在。如果没有,则使用delete命令将其从数据库中删除

  • 如果您有大量数据,第4步可能会变得非常缓慢。一种稍微不同的更有效的方法取决于是否可以在UI中将记录“标记”为已删除,并在不删除记录的情况下将其隐藏在视图中。然后,您可以使用设置为“I”、“U”或“D”的状态替换已更改的标志,具体取决于它是插入、更新还是删除。然后,您只需要对数据进行一次传递。

    我将采用的方法是使用主键将更新、插入和删除绑定到更改中,并对数据进行两次传递

  • 将列表从数据库加载到UI中,并针对该项存储ID。此外,存储一个“已更改”标志,该标志最初为每个项目设置为false
  • 对UI中的数据进行如下更改:
    • 通过添加它们,将ID(主键)设置为-1,并将更改的标志设置为true,来添加数据
    • 通过编辑数据并将更改标志设置为true来更新数据
    • 只需删除数据即可将其从数据中删除
  • 遍历列表中更改标志为true的每个项目,并执行以下操作