mysql多层开发更新数据问题
问题:
开发环境: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
相关新闻>>
- 发表评论
-
- 最新评论 更多>>