There can be no Triumph without Loss,No Victory without Suffering,No Freedom without Sacrifice.
All you have to decide is what to do with the time that is given to you.
Get busy Living, or Get busy Dying?
  首页 | 留言给我 | 订阅 Rss | CLI | 黄白之恋 Posts:158   Hits: 1326900    Comments: 168    
 日历归档
<<  <  2018 - 11  >  >>
SuMoTuWeThFrSa
    123
45678910
11121314151617
18192021222324
252627282930
 About Me
 Name: ZhangSichu
 Sex: Male
 Age: 32
 Email: ZhangSichu@gmail.com
 MSN: ZhangSichu@hotmail.com
 Home: ZhangSichu.com
 WeiBo: weibo.com/zhangsichu
 个人推荐
 分类归档
  ·C++/C(5)  RSS
  ·软件工程(1)  RSS
  ·杂事/随感(26)  RSS
  ·.Net/Java(30)  RSS
  ·面向对象程序设计(5)  RSS
  ·汇编/破解(0)  RSS
  ·平面设计(3)  RSS
  ·SQL(5)  RSS
  ·COM/COM+(2)  RSS
  ·Web开发(81)  RSS
 My Friends
Back Forward Refresh Home 2018年11月15日 星期四 RSS CLI Mine Sweeper. In Javascript.

  使用System.Data.Common.DbDataAdapter.Update()方法时出现的问题
字体大小 [ ]

使用System.Data.Common.DbDataAdapter.Update()方法时出现的问题,给我的教训:当出问题的时候使用SQLProfiler可以很好的判断问题的原因。

出问题的现场:程序分为客户端和服务器端。当程序开启的时候,会执行一种数据同步的操作,把远程的一个SQL Server数据库的数据Download并同步到本地,使得本地的MDB数据库是远程SQLServer数据库的一个子集。用这个MDB数据库作为本地程序的一个缓冲。以提高程序的性能。

原始程序中用System.Data.Common.DbDataAdapter.Update()这个方法Update一个DataSet。原来这段程序一直运行正常。最近,客户有一个新需求,需要改动数据同步的逻辑,让一个同步到本地的字段进行一次加密。Server的数据是原始数据,同步到本地MDB的数据是加密过一次的数据。程序测试了一段时间一直没有问题。当快要发布的时候,报了一个Bug。说User信息不能更新。跟踪客户端发给服务器端的User信息的DataSet没有问题是更改过的新数据。跟踪服务器端收到的DataSet,也是更新过的正确数据。但是就是不能更新数据。这个太奇怪了。

后来所有点都查了,所有问题都集中到System.Data.Common.DbDataAdapter. Method (DataSet)这个方法的调用上。就是这个方法调用了没有起作用,才产生了这个Bug。MSDN对这个方法的介绍是:Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified DataSet. 估计这个方法的下面也是执行一段特定的SQL。 用SQLProgiler跟踪发现这个方法会执行exec sp_executesql NUPDATE users SET Column1 = @p1…. , WHERE ( (Column4 = @p4) AND …, N@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 nvarchar(4000),@p4 uniqueidentifier,…. , @p1 = Nuser1, @p2 = Nuser1, @p3 = N user1p3,…. 这样一种SQL。 把这段SQL放在 SQL Query Analyzer中执行后确实没有更新数据。就是这段SQL的问题,导致了不能更新数据。是Where语句不能找到一条确定数据。由于发给服务器的数据是从MDB中取出来的,并且修改了部分内容的DataSet。而Server是要更新的服务器数据。Where语句中的一个字段正是同步到本地被加密过一次的内容,而服务器是原始内容产,由于用户没有改这个字段的内容,所以被拼入了Where语句。生了数据找不到的错误。
  Posted @ 1/11/2007 10:16:31 PM | Hits (76750) | Comment (0

  Post Comment
标题 *
作者 *
密码 记住我
评论 *
    


Stable in Firefox 1.5 2.0Stable in IE6 IE7Stable in MozillaStable in Netscape
ZhangSichu.com V0.1.7507
Powered By ZhangSichu
Copyright © ZhangSichu
Download ZhangSichu.com source code. Download source code