当 RowState = Modified 时 SQLDataAdapter.Update() 不更新

     2023-05-08     137

关键词:

【中文标题】当 RowState = Modified 时 SQLDataAdapter.Update() 不更新【英文标题】:SQLDataAdapter.Update() not Updating when RowState = Modified 【发布时间】:2018-05-15 16:41:39 【问题描述】:

我正在尝试设置一个程序,当用户更新项目描述时,将在保存表单时更新数据库。我已经设置了我发现所需的所有内容,但适配器从未更新。它选择和插入很棒,但从不更新。代码如下:

  internal void UpdateDB(DataTable Items)
    
      using ( var ItemsAdapter = new SqlDataAdapter("select * from dbo.Items", Properties.Settings.Default.ConnectionString) )
      using ( var ItemsCB = new SqlCommandBuilder(ItemsAdapter) )
      
        ItemsAdapter.UpdateCommand = ItemsCB.GetUpdateCommand(true);
        ItemsAdapter.InsertCommand = ItemsCB.GetInsertCommand(true);
        ItemsAdapter.DeleteCommand = ItemsCB.GetDeleteCommand(true);

        ItemsAdapter.AcceptChangesDuringUpdate = true;
        foreach ( DataRow Row in Items.AsEnumerable() )
        
          if ( !_Items.TableContains("Item", Row["Item"]) )
           Row.AcceptChanges(); Row.SetAdded(); 
          else if ( _Items.TableContains("Item", Row["Item"]) )
           Row.AcceptChanges(); Row.SetModified(); 
        
        ItemsAdapter.Update(Items);

        _LoadAll();
      
    

.TableContains() 扩展是我构建的一个自制扩展,用于检查表以查看值是否存在。它运行完美,并将已存在 PK 的行设置为已修改,将不存在 PK 的行设置为已添加。

public static bool TableContains(this DataTable DT, string ColumnName, object ItemtoCheck)

  return DT.AsEnumerable()
           .Select(r => r.Field<string>(ColumnName))
           .ToList()
           .FindIndex(x => x.Equals(ItemtoCheck.ToString(), StringComparison.OrdinalIgnoreCase)) != -1;

_LoadAll(); 方法只是在对数据库进行更改后重新加载所有DataTables 的方法。

【问题讨论】:

【参考方案1】:

我发现我做错了什么。我正在使用一个具有null 引用作为其原始行值的表,当SQLDataAdapter.Update() 运行时,它正在寻找具有null 值的行,该值不存在因此被忽略。为了解决这个问题,我改变了我的“项目”表逻辑如下:

    ItemsAdapter.AcceptChangesDuringUpdate = true;
    foreach ( DataRow Row in Items.AsEnumerable() )
    
      if ( !_Items.TableContains("Item", Row["Item"]) )
       ItemsTable.Rows.Add(Row); 
      else if ( _Items.TableContains("Item", Row["Item"]) )
      
        ItemsTable.AsEnumerable()
                  .Join(Items.AsEnumerable(), r1 => r1.ItemArray[0], r2 => r2.ItemArray[0], (r1, r2) => new  r1, r2 )
                  .ToList()
                  .ForEach(i => i.r1.SetField(1, i.r2.ItemArray[1]));
      
    
    ItemsAdapter.Update(ItemsTable);

此更改将传递给更新方法的新表设置为将包含数据库值的内部DataTable 更新为新的更新,然后使用它来更新数据库并且它正常工作。

希望这可以帮助任何可能最终遇到与我相同的问题的人。

【讨论】:

在不更改原始 RowState 的情况下对数据集中的数据表进行排序

】在不更改原始RowState的情况下对数据集中的数据表进行排序【英文标题】:SortingDatatableinDatasetwithoutchangingtheOriginalRowState【发布时间】:2012-08-2522:25:57【问题描述】:我有一个数据集,其中有2个表可用。这些表是在加载页面时... 查看详情

DataGridViewComboBoxColumn 值更改不会将 RowState 更改为已修改

】DataGridViewComboBoxColumn值更改不会将RowState更改为已修改【英文标题】:DataGridViewComboBoxColumnvaluechangenotchangingRowStatetomodified【发布时间】:2012-10-2910:01:08【问题描述】:我在我的数据网格视图中添加了一个查找组合框。对现有行... 查看详情

dynamics ax 2012:将 RowState 从 Edit 更改为 Selected

】dynamicsax2012:将RowState从Edit更改为Selected【英文标题】:dynamicsax2012:ChangeRowStatefromEdittoSelected【发布时间】:2011-12-2113:14:58【问题描述】:在AXGridView中,我想改变选中行的行状态,从编辑模式变为选中模式。这需要在单击外部... 查看详情

If-None-Match 有效时 304 Not Modified

】If-None-Match有效时304NotModified【英文标题】:304NotModifiedWhenIf-None-Matchisvalid【发布时间】:2014-07-2218:21:25【问题描述】:我正在优化一个ExpressJSONAPI以供iOS和Android应用使用,当应用在If-None-Match标头中指定etag时,似乎无法让Express... 查看详情

浏览器缓存详解:expires,cache-control,last-modified,etag详细说明

...了一个草图:  每个状态的详细说明如下:1、Last-Modified在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(HttpReponseHeader)此文件在服务期端最后被修改... 查看详情

RowState.Added 和 DataRowVersion.Original 有啥区别

】RowState.Added和DataRowVersion.Original有啥区别【英文标题】:WhatisthedifferencebetweenRowState.AddedandDataRowVersion.OriginalRowState.Added和DataRowVersion.Original有什么区别【发布时间】:2018-02-1317:22:48【问题描述】:我有一个具有3个条件的函数:如... 查看详情

为啥在发送 If-Modified-Since 标头时 Varnish 不发送未修改的 304?

】为啥在发送If-Modified-Since标头时Varnish不发送未修改的304?【英文标题】:Whyisn\'tVarnishsending304unmodifiedwhenIf-Modified-Sinceheaderissent?为什么在发送If-Modified-Since标头时Varnish不发送未修改的304?【发布时间】:2012-03-1303:42:20【问题描... 查看详情

Winforms Databound Combobox 更新数据但不改变 RowState

】WinformsDataboundCombobox更新数据但不改变RowState【英文标题】:WinformsDataboundComboboxupdatesdatabutdoesnotchangeRowState【发布时间】:2021-01-2120:09:26【问题描述】:.NET4.7.2Winformsc#有一个包含一堆组合框的表单。所有人的下拉列表。组合框... 查看详情

绑定到 DataRowView 的 Winforms 控件更改行值但不更改 RowState

】绑定到DataRowView的Winforms控件更改行值但不更改RowState【英文标题】:WinformsControlBoundToDataRowViewChangesRowValuesButNotRowState【发布时间】:2019-12-2905:29:34【问题描述】:一个简单的WinForms应用程序,用于了解控件数据绑定。下面的代... 查看详情

当 regex101 匹配时,RegEx C# 不匹配

】当regex101匹配时,RegExC#不匹配【英文标题】:RegExC#doesntMatchwhenregex101does【发布时间】:2018-08-1220:43:50【问题描述】:这是我的模式:-8\\s+((?:[0-9]2\\/[0-9]2\\/[0-9]2)\\s+(?:[0-9]2:[0-9]2:[0-9]2))\\s+(?:LINE)\\s+=\\s+([0-9]0,9)\\s+(?:STN)\\s+=\\s+( 查看详情

我的输入处理寻找“S”,但是当我输入“S”时,脚本就终止了

】我的输入处理寻找“S”,但是当我输入“S”时,脚本就终止了【英文标题】:Myinputhandlinglooksfor"S",butwhenItype"S"thescriptjustterminates【发布时间】:2021-06-2515:13:52【问题描述】:我尝试制作一个UNO分发系统,但它似... 查看详情

有n个并发进程,设s是用于互斥信号量,其初值s=3,当s=-2时,意味着(),执行一个p(s)操作

有N个并发进程,设s是用于互斥信号量,其初值s=3,当s=-2时,意味着(),执行一个P(s)操作,后果();当s=-2时,执行一个V(s)操作,后果(),当s=0时,意味着()参考技术A去23454556678 查看详情

Etags 和 last-modified over https SSL?

】Etags和last-modifiedoverhttpsSSL?【英文标题】:Etagsandlast-modifiedoverhttpsSSL?【发布时间】:2013-10-0617:42:19【问题描述】:是否可以通过安全的HTTPS连接对条件GET请求使用HTTP缓存?我已经通过非安全HTTP进行缓存,但是当我切换到HTTPS... 查看详情

文件下载的缓存策略(代码片段)

文件缓存:ETag或Last-Modified判断文件缓存是否有效如果服务器端的资源没有变化,则自动返回HTTP304(NotChanged.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回... 查看详情

Gridview 在 RowDataBound 上动态添加行,具有相同的 RowState(Alternate 或 Normal)

】Gridview在RowDataBound上动态添加行,具有相同的RowState(Alternate或Normal)【英文标题】:GridviewaddingrowdynamicallyonRowDataBoundwiththesameRowState(AlternateorNormal)【发布时间】:2012-01-1716:39:12【问题描述】:我根据RowDataBound事件当前绑定的Row... 查看详情

当字段值 = 1 时更改背景颜色的 s-s-rS 问题

】当字段值=1时更改背景颜色的s-s-rS问题【英文标题】:s-s-rSIssuewithChangingBackgroundColourwhenfieldvalue=1【发布时间】:2016-02-1214:47:31【问题描述】:目前我正在设置我的表格,如果值为1,则将单元格的颜色更改为蓝色。我使用以下... 查看详情

s-s-rS 报告 - 当用户单击全选选项时,在参数中显示“全部”

】s-s-rS报告-当用户单击全选选项时,在参数中显示“全部”【英文标题】:s-s-rSReporting-show"All"inparameterwhentheuserclicksonSelectAlloption【发布时间】:2021-09-2118:18:03【问题描述】:当用户单击多选参数中的“全选”选项时,我... 查看详情

dbset.attach(实体)与dbcontext.entry(实体).state=entitystate.modified区别(代码片段)

...ate方法时,实体框架将你实体的所有属性标记为EntityState.Modified,所以跟踪它们。如果你只想更改部分属性,而不是全部属性,请使用DbSet.Attach。这种方法使你的所有属性EntityState.Unchanged,所以你必须使你的属性,你想更新EntityS... 查看详情