三层结构数据库更新问题

gyf2000 2017-04-24 02:19:23
三层结构数据库更新问题
服务器端TDatasetProvider->TAdoQuery->SQL2005,如果TAdoQuery的SQL里只有一个表的语句,
比如select * from BM,则在客户端调用ApplyUpdates(0)可以成功更新数据库;但当TAdoQuery的SQL
是两个表的关联时,比如select * from BM A, BMLX B where A.ID=B.ID时,客户端调用ApplyUpdates(0)则失败,第一次使用,请大家指点下怎么使用.
...全文
1006 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
日月路明 2017-11-27
  • 打赏
  • 举报
回复
举个例子:
if Object_id('DrugMaterial.vDMItem_InsertXML') is not null 
	drop proc DrugMaterial.vDMItem_InsertXML 
go 
--对应字段说明:GWFlag,IsBase,IsZCY,IsKCWZ,ZBYPBH,YpID,Name,CommonName,FJSM,WJBM,Gg,Addr,YkUnit,YfUnit,Zhxs,PriceID,Yhj,Pfj,Lsj,SellPrice,BarCode,Gmp,TID,ManageType,MaxPrice,StorageMin,StorageMax,NormalNum,FactoryID,Mzby,Bqby,YFKCEnable,Grade,Drink,Import,Special,CFbit,Recipe,PassFileNo,Enable,Mark,YKHouseName,YPKW,TSYPFL,PCManage,Sbm,Wbsbm,CommonPYSBM,CommonWBSBM,Pishi,PrintGG,IsKJY,KJYDengji,DDDVal,TYMBM,JxID,ZBYPID,Flag,JSTag,DefUsage,DefDose,MaxDose,DefFrequency,MR_Code,IsZF,YWYM,Glsl,Ljybz,Recycle,MzUsed,BQUsed,Gzhc 
--说明:@GWFlag:高危药品标志,@IsBase:基本药物,@IsZCY:中草药,@IsKCWZ:库存物质,@ZBYPBH:招标编号,@YpID:编号,@Name:名称,@CommonName:通用名,@FJSM:附加说明,@WJBM:物价编码,@Gg:规格,@Addr:产地,@YkUnit:单位|药库,@YfUnit:单位|药房,@Zhxs:单位|转换系数,@PriceID:PriceID,@Yhj:进价,@Pfj:批价,@Lsj:零价,@SellPrice:销售价格,@BarCode:条形码,@Gmp:Gmp,@TID:TID,@ManageType:药品管理类型,@MaxPrice:最高限价,@StorageMin:最低库存,@StorageMax:最大库存,@NormalNum:常规进货量,@FactoryID:FactoryID,@Mzby:药房摆药|门诊,@Bqby:药房摆药|病区,@YFKCEnable:药房摆药|库管,@Grade:药品等级,@Drink:中药饮品,@Import:进口药,@Special:特殊药,@CFbit:处方打印标记,@Recipe:处方药,@PassFileNo:批准文号,@Enable:使能标记,@Mark:备注,@YKHouseName:药品库房,@YPKW:库位,@TSYPFL:TSYPFL,@PCManage:批次管理,@Sbm:拼音编码,@Wbsbm:五笔编码,@CommonPYSBM:通用拼音编码,@CommonWBSBM:通用五笔编码,@Pishi:皮试,@PrintGG:打印规格,@IsKJY:抗菌药|是/否,@KJYDengji:抗菌药|等级,@DDDVal:抗菌药|DDD,@TYMBM:TYMBM,@JxID:JxID,@ZBYPID:ZBYPID,@Flag:Flag,@JSTag:激素标记,@DefUsage:缺省用法,@DefDose:缺省剂量,@MaxDose:每日最大剂量,@DefFrequency:缺省频度,@MR_Code:费用代码,@IsZF:自费标记,@YWYM:一物一码,@Glsl:管理数量,@Ljybz:廉价药标志,@Recycle:可回收,@MzUsed:门诊启用标记,@BQUsed:病区启用标记,@Gzhc:高值耗材 
create proc DrugMaterial.vDMItem_InsertXML 
  @Version int,@XMlData text 
as 
BEGIN 
	declare @idoc int 
	exec sp_xml_preparedocument @idoc output,@XMLData 
	select *  
	into #Paras 
	from openxml(@idoc,'/root/paravalue',1) 
			with(gwflag varchar(1),isbase bit,iszcy bit,iskcwz bit,zbypbh varchar(15),ypid int,name varchar(50),commonname varchar(50),fjsm varchar(30),wjbm varchar(15),gg varchar(30),addr varchar(50),ykunit varchar(10),yfunit varchar(10),zhxs int,priceid int,yhj money,pfj money,lsj money,sellprice money,barcode varchar(30),gmp int,tid int,managetype varchar(10),maxprice money,storagemin money,storagemax money,normalnum money,factoryid int,mzby bit,bqby bit,yfkcenable bit,grade smallint,drink bit,import bit,special bit,cfbit bit,recipe bit,passfileno varchar(50),enable bit,mark varchar(20),ykhousename varchar(20),ypkw varchar(20),tsypfl smallint,pcmanage bit,sbm varchar(10),wbsbm varchar(10),commonpysbm varchar(10),commonwbsbm varchar(10),pishi bit,printgg varchar(30),iskjy bit,kjydengji varchar(10),dddval money,tymbm varchar(15),jxid int,zbypid int,flag int,jstag bit,defusage varchar(20),defdose varchar(10),maxdose varchar(10),deffrequency varchar(10),mr_code varchar(20),iszf bit,ywym bit,glsl money,ljybz bit,recycle bit,mzused bit,bqused bit,gzhc bit) 
	EXEC sp_xml_removedocument @idoc 
 
	insert into DrugMaterial.vDMItem (GWFlag,IsBase,IsZCY,IsKCWZ,ZBYPBH,YpID,Name,CommonName,FJSM,WJBM,Gg,Addr,YkUnit,YfUnit,Zhxs,PriceID,Yhj,Pfj,Lsj,SellPrice,BarCode,Gmp,TID,ManageType,MaxPrice,StorageMin,StorageMax,NormalNum,FactoryID,Mzby,Bqby,YFKCEnable,Grade,Drink,Import,Special,CFbit,Recipe,PassFileNo,Enable,Mark,YKHouseName,YPKW,TSYPFL,PCManage,Sbm,Wbsbm,CommonPYSBM,CommonWBSBM,Pishi,PrintGG,IsKJY,KJYDengji,DDDVal,TYMBM,JxID,ZBYPID,Flag,JSTag,DefUsage,DefDose,MaxDose,DefFrequency,MR_Code,IsZF,YWYM,Glsl,Ljybz,Recycle,MzUsed,BQUsed,Gzhc)
	select GWFlag,IsBase,IsZCY,IsKCWZ,ZBYPBH,YpID,Name,CommonName,FJSM,WJBM,Gg,Addr,YkUnit,YfUnit,Zhxs,PriceID,Yhj,Pfj,Lsj,SellPrice,BarCode,Gmp,TID,ManageType,MaxPrice,StorageMin,StorageMax,NormalNum,FactoryID,Mzby,Bqby,YFKCEnable,Grade,Drink,Import,Special,CFbit,Recipe,PassFileNo,Enable,Mark,YKHouseName,YPKW,TSYPFL,PCManage,Sbm,Wbsbm,CommonPYSBM,CommonWBSBM,Pishi,PrintGG,IsKJY,KJYDengji,DDDVal,TYMBM,JxID,ZBYPID,Flag,JSTag,DefUsage,DefDose,MaxDose,DefFrequency,MR_Code,IsZF,YWYM,Glsl,Ljybz,Recycle,MzUsed,BQUsed,Gzhc 
	from #Paras 
END 
go 
---------------------------------------------------------------------------------
日月路明 2017-11-27
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
ApplyUpdates(0)我已经放弃使用它,bug太多。 直接使用SQL语句,来更新一行数据:

  SQL:='Update 养老机构月报表 Set '+
       '分支='+#39+sFCID+#39+','+
       '年月='+#39+YearMonth+#39+','+
       '入住老人数='+#39+Edit1.Text+#39+','+
       '平均收费标准='+#39+Edit56.Text+#39+
       ' where ID='+#39+ID+#39;
  if Not DataModule1.SocketConnection1.AppServer.MyQuery(SQL,err)
    then MessageBox(self.handle,pchar('更新数据出错:   '+err),'错误',MB_OK+MB_ICONERROR);
我是写了一个更新的函数,用于DBGrid更新数据。这样就方便了。

  UpDataOneDBGridEh(DBGridEh1,'老人床位分布');       // DBGrid 保存更新一条数据
对于已经修改了的多条数据的全部更新,可以模仿ApplyUpdates(0)的机制,自己重新写了一个方法代替它。

  UpDataDBGridEh(DBGridEh1,'老人床位分布');         // DBGrid 保存更新一条数据
殊途同归,我们也不直接使用ApplayUpDate,自己拼sql,我们为了方便增加数据校验规则,一般用存储过程实现,字段参数用xml进行封装成一个字段,这样存储过程的形参就稳定下来,不管字段有多少,形参都一样
qiankunbobo 2017-11-27
  • 打赏
  • 举报
回复
Update A Set Field1='aaa' where Field2='deage'; Update B Set Field1='aaa' Where Field2='deage'; 用事务提交这个SQL不就得了嘛
fansfantasy 2017-04-26
  • 打赏
  • 举报
回复
Applyupdate 只能更新一个表. 说到底也是产生一条update语句给SQL, 你见过哪个Update语句能同时更新2个表的?
lyhoo163 2017-04-24
  • 打赏
  • 举报
回复
ApplyUpdates(0)我已经放弃使用它,bug太多。 直接使用SQL语句,来更新一行数据:

  SQL:='Update 养老机构月报表 Set '+
       '分支='+#39+sFCID+#39+','+
       '年月='+#39+YearMonth+#39+','+
       '入住老人数='+#39+Edit1.Text+#39+','+
       '平均收费标准='+#39+Edit56.Text+#39+
       ' where ID='+#39+ID+#39;
  if Not DataModule1.SocketConnection1.AppServer.MyQuery(SQL,err)
    then MessageBox(self.handle,pchar('更新数据出错:   '+err),'错误',MB_OK+MB_ICONERROR);
我是写了一个更新的函数,用于DBGrid更新数据。这样就方便了。

  UpDataOneDBGridEh(DBGridEh1,'老人床位分布');       // DBGrid 保存更新一条数据
对于已经修改了的多条数据的全部更新,可以模仿ApplyUpdates(0)的机制,自己重新写了一个方法代替它。

  UpDataDBGridEh(DBGridEh1,'老人床位分布');         // DBGrid 保存更新一条数据

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧