Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何基于非“删除”删除方法在数据集中自动生成自定义命令?_C#_.net_Dataset - Fatal编程技术网

C# 如何基于非“删除”删除方法在数据集中自动生成自定义命令?

C# 如何基于非“删除”删除方法在数据集中自动生成自定义命令?,c#,.net,dataset,C#,.net,Dataset,我在一个C项目中使用数据集访问SQLServer200x。我们的常见做法是,在几乎所有的表中,不删除记录。取而代之的是,我们有一个字段,它只保存一点记录是否被删除。我可以手动编辑数据集中的每个表,并使它们的select命令包含Where Deleted=0,而delete命令是一个更新。然而,这是乏味的 有没有办法更改VS用于为TableAdapter生成命令的方法,以便自动为其添加此功能 编辑: 实际上,这是一种定制GenerateDBDirectMethods功能的方法。您可以通过数据库视图

我在一个C项目中使用数据集访问SQLServer200x。我们的常见做法是,在几乎所有的表中,不删除记录。取而代之的是,我们有一个字段,它只保存一点记录是否被删除。我可以手动编辑数据集中的每个表,并使它们的select命令包含Where Deleted=0,而delete命令是一个更新。然而,这是乏味的

有没有办法更改VS用于为TableAdapter生成命令的方法,以便自动为其添加此功能

编辑:
实际上,这是一种定制GenerateDBDirectMethods功能的方法。

您可以通过数据库视图访问数据并在那里进行过滤

我个人不喜欢数据集定义中的SQL命令

编辑:

没有一种内在的可能性可以做到这一点。您可以创建一个VS加载项并在解决方案资源管理器的上下文菜单上右键单击.xsd调用它,也可以从主菜单打开DS并调用加载项。然后,外接程序将解析xsd并识别select和update文本并进行更正。这可能只有在从SQLServer生成DS拖放之后才有用

有关add.in,请参见:


我个人会走DB的路。创建为您执行筛选的视图,并在那些将执行更新而不是删除的视图上添加删除触发器。这样,您就消除了在应用程序上执行此操作的负担,并使其成为制作物理数据库模型的人员的责任。这将在每个表中执行一次。相反,您可能在处理使用同一db表的单表多个数据集的代码中有多个点。

我不认为您能够使用类似SqlCommandBuilder的东西自动生成这些数据集

相反,您可能希望做的是利用以下事实,即数据集自动生成代码中的强类型数据集和数据适配器使用分部类,因此您应该能够向分部类添加一些附加逻辑,这将覆盖默认实现

例如,您应该能够覆盖生成的数据表适配器上的InitCommandCollection方法,然后可以在Update isDeleted=1中替换该方法,而不是delete命令


你将不得不写一些关于这方面的智慧,但它应该会帮助你。我建议让表适配器检查一个列表,看看表名是否在列表中,如果在列表中,那么您知道您正在处理一个已删除的列,如果不在列表中,那么它就是一个可删除的表记录。

我将考虑使用类似的工具和创建自定义模板来创建数据集,而不是使用拖放设计器。首先,创建模板需要更长的时间,但可以控制和重复创建的内容


否则,请查看其中一个更好的ORM系统,并自定义其映射以执行您想要的操作。

删除的位字段是在Sql Server表中定义的,还是在从DB读取后添加到数据集?此删除的字段位于SS中的数据库架构中。如果使用视图和触发器执行DB方式,我将使用CodeSmith从基表生成视图和触发器,假设您有多于1或2个表。