使用ASP.NET C#在Microsoft SQL中添加/更新/删除查找表的最佳方法是什么?

使用ASP.NET C#在Microsoft SQL中添加/更新/删除查找表的最佳方法是什么?,c#,sql-server,lookup,C#,Sql Server,Lookup,我正在从事一个本地城市项目,对如何在Microsoft SQL 2000中有效地创建“公园”和“活动”之间的关系有一些疑问。我们正在使用ASP.NET C# 我有两个表“Parks”和“Activities”。我还创建了一个查找表,在“Parks”和“Activities”的主键上设置了适当的关系。我的查找表称为“Parksativies” 我们有大约30项活动可以与每个公园联系在一起。一名实习生将管理该网站,活动将每6个月评估一次 到目前为止,我已经创建了一个管理工具,允许您添加/编辑/删除每

我正在从事一个本地城市项目,对如何在Microsoft SQL 2000中有效地创建“公园”和“活动”之间的关系有一些疑问。我们正在使用ASP.NET C#

我有两个表“Parks”和“Activities”。我还创建了一个查找表,在“Parks”和“Activities”的主键上设置了适当的关系。我的查找表称为“Parksativies”

我们有大约30项活动可以与每个公园联系在一起。一名实习生将管理该网站,活动将每6个月评估一次

到目前为止,我已经创建了一个管理工具,允许您添加/编辑/删除每个公园。添加一个公园很简单。数据是新的,所以我只允许他们编辑公园的详细信息,并将从数据库中动态提取的“活动”关联起来。这是在中继器控制中完成的

编辑很有用,但我觉得它并没有那么有效。保存主公园详细信息没有问题,因为我只需在创建的公园实例上调用
Save()
。但是,要删除查找表中的过时记录,我只需从ParkSactivies中删除ParkID=@ParkID,然后为每个选中的活动插入一条记录

对于查找表上的ID列,我有一个递增的整数值,经过一段时间的测试,这个整数值已达到数千。虽然这确实有效,但我觉得必须有更好的方法来更新查找表

有人能提供一些关于如何改进这一点的见解吗?我目前正在使用存储过程,但我并不擅长非常复杂的语句

[ParkID | ParkName | Latitude | Longitude ]  
 1      | Freemont | -116.34  | 35.32  
 2      | Jackson  | -116.78  | 34.2    


[ActivityID | ActivityName | Description ]
1           | Picnic       | Blah
2           | Dancing      | Blah
3           | Water Polo   | Blah

[ID | ParkID | ActivityID ]
 1  | 1      | 2
 2  | 2      | 1
 3  | 2      | 2
 4  | 2      | 3

我更愿意学习如何以一种更通用的方式来实现它,而不是使用LinqToSQL或ADO.NET。

LinqToSQL和ADO.NET有什么问题吗?我的意思是,您能否详细说明您对使用这些技术的疑问

更新

如果LinqToSQL在2000年不受支持,您可以轻松升级到免费的2008 express。对于您描述的目的来说,这绝对足够了

与使用LINQ2SQL或ADO.NET相比,您更愿意学习如何以更通用的方式进行此操作

很明显,您使用的是ADO.NET内核:)。这很好,我认为您应该坚持使用存储过程和DbCommands之类的

如果您使用的是MSSQL 2008,则可以使用表值参数和MERGE语句来执行此操作。由于您使用的是MSSQL 200(为什么?),您需要执行以下操作: 1.将以逗号分隔的活动ID列表(新的)和ParkId一起发送到存储的进程。例如,ActivityID参数将是varchar(50)

在存储过程中,可以拆分ID

战略应该是这样的 1.对于传入的ID,删除不匹配的记录

这方面的SQL应该是

从公园活动中删除 其中ActivityId不在(某些ID列表) 其中ParkId=@ParkId

因为你的列表是一个字符串,你可以这样做

EXEC('DELETE FROM ParkActivities,其中ActivityId不在('+@ActivityId+')且ParkId='+@ParkId)

  • 现在,您可以插入表中尚未包含的活动。最简单的方法是将ParkActivity ID插入临时表中。为此,您需要将逗号分隔的列表拆分为单个ID,并将其插入临时表中。一旦临时表中有数据,您就可以插入并执行联接
  • 是MSSQL 2000中的内置用户定义函数,可以执行拆分并返回一个表变量,每个值位于单独的行上。

    使用ORM?使用LINQ2SQL有什么问题?@Mitch:我不确定它是否支持SQL Server 2000。我会担心使用SQL 2000;在停止支持之前不会有那么多个月……谢谢你!我在网站上找到了一个关于如何创建一个函数的网站,该函数可以将逗号分隔的列表转换为表。我使用SQL 2000的原因不是由于您的选择。是的,有一些人仍然在运行此功能,特别是一些较小的政府机构。Square先生,是的,我完全理解必须使用MSSQL 2000。由于您使用的是ADO.NET core,您可能需要查看我博客上的一些博文。DataReader Wrappers讨论如何使用DbDataReaders(出于性能方面的原因)并获得了强大的键入功能。Data Access Layer CodeGen发布了一篇关于我在使用存储过程时用来生成大量数据访问层代码的工具的文章。您可能会觉得它很方便。