mysql多层开发更新数据问题

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 16:36 点击:

问题:
开发环境:delphi7se + mysql 5.0.67 + dbexpress 2.0 + mysql50open
开发控件:tsimpledataset+datasoure+dbgrid/dbedit
权限:mysql已经授权用户有select/update权限.
但是如果数据有修改,applyupdates(0)始终报告出错.
加入outputdebugstring(pchar(strList)),在view/debug windows/event log中监测到两条错误信息:
"Record not found or changed by another user."
"Unable to find record. No key specified."

解决方法:
from php?cid=30&fid=66&tid=35255">http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=35255

測試的 Form 內放了 TSQLConnection、TSQLQuery、TDataSetProvider、TClientDataSet、TDataSource、TDBGrid、TDBNavigator 各一個
TSQLConnection 指定 Connection Name 使它和資料庫連接
TSQLQuery 連上 TSQLConnection, 指定 SQL (為最簡單的 SELECT * FROM ...), 然後在TSQLQuery的fields属性中添加所有所有的字段, 除了 PK 不動, 其它的列的 ProviderFlags 去掉 pfInWhere(注意喔, PK 的 pfInWhere 要保持勾選喔, 非 PK 的則去掉)
TDataSetProvider 連上 TSQLQuery
TClientDataSet 連上 TDataSetProvider, 並撰寫 AfterPost (內容就是資料庫交易和 ApplyUpdate) 及 ReconcileError (呼叫 HandleReconcileError)
TDataSource,TDBGrid,TDBNavigater 設好基本屬性..

Build 出執行檔後, 執行兩份(A和B), 進行測試...
針對同一筆資料, A 先異動(PK不異動), 儲存後, B 異動(不管含不含PK), 可成功的儲存 (A,B都按一下更新鈕, 會發現資料以 B 的為最新)
針對同一筆資料, A 先異動(包含PK), 儲存後, B 異動(不管含不含PK), 出現 "Record not found or changed by another user" 訊息
按取消, 或者選修正並將PK值改成A所輸入的新PK值, 即可通過

原因:
众说纷纭.但基本有两点需要注意:
引用:"ClientDataSet提交时出现"Record not found or changed by another user"错误提示
分析原因可能是找不到更新数据,从网上搜索到大致原因有一下几个方面:
1、没有主键
2、某些字段不能识别
某些提供解决方案也无非是设置DSP的UpdateMode属性,去掉字段的一些默认值
这些问题,我仔细检查了一下,感觉不可能存在,仔细分析原因:我更新记录是分两种方式
一种是:clientdataset.append;
....
提交后再更新
另外一种是大批量插入表,然后打开数据集更新
而第一种方案不存在这个问题,我开始分析第2种方案可能存在的问题。有如下语句:
INSERT INTO tableA (field1,field2) SELECT field1,'' FROM tableb
前几天发现ClientDataSet的CommandText用SELECT ''是不能识别的,提示无效的参数
我想是不是这个原因造成,所以将''改为' '一些正常。"

根据mysql的日志分析,我碰到的是第2种情况,但因为字段众多,修改起来比较麻烦,同时我也不想手工写sql语句.
在按照上面的方法修改前datasnap回传的sql语句是
update students set
曾用名 = '99'
where
班级 = '1' and
注册学号 = '080801031286' and
身份证号 = 'xxx' and
姓名 = '顾xx' and
曾用名 = '' and
性别 = '女' and
民族 = '汉族' and
籍贯省 = '江苏' and
籍贯市县 = 'xxx市' and
家庭地址 = 'xxx路51号2单元702' and
联系电话 = '1335' and
毕业学校 = 'xxx' and
父亲姓名 = '' and
父亲单位 = '' and
母亲姓名 = '' and
母亲单位 = ''
可以看到,窗体中所涉及到的所有字段,无论是否修改,全部都回传到mysql,累赘.
在按照上面的方法修改后datasnap回传的sql语句是
update students set
曾用名 = '11'
where
注册学号 = '080801031285'

update students set
曾用名 = 'qq',
父亲姓名 = 'aa',
父亲单位 = 'bbbbb',
母亲姓名 = 'cc',
母亲单位 = 'ddddd'
where
注册学号 = '080801031286'

COMMIT
现在,只涉及到窗体中数值发生修改的字段.
两相对比可以看出,后面的sql语句更简单,效率更高.

另外老外的说法也有道理,这是mysql非标准sql造成的:
As I posted in a reply to this thread in dbexpress, I suspect the
posters problem is

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • mysql-mmm
      • mysqldump命令——MySQL数据库备份还原
      • Oracle数据导入MySQL的快捷工具:MySQL Migration Toolkit
      • 简简单单储存过程——循环一个select结果集
      • MySQL数据库十大优化技巧
      • Mysql安装笔记
      • Mysql主主复制架构配置
      • Mysql的Procedure 参数为NULL问题分析
      • MySQL Stmt预处理提高效率问题的小研究
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1