日历归档 |
|
<< < 2024 - 12 > >> | Su | Mo | Tu | We | Th | Fr | Sa | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|
|
|
About Me |
|
|
ZhangSichu |
|
Male |
|
32 |
|
ZhangSichu@gmail.com |
|
ZhangSichu@hotmail.com |
|
ZhangSichu.com |
|
weibo.com/zhangsichu |
|
|
|
个人推荐 |
|
|
|
|
分类归档 |
|
|
|
|
My Friends |
|
|
|
|
使用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语句。生了数据找不到的错误。
|
|
|
|
|
|