Delphi下的BDE中的UpdateSql的用法? 哪位仁兄能回答这个问题:Delphi下的BDE中的UpdateSql的用法?小弟在学习bde数据库编程时不知道UpdateSql的用法,和其一般在哪些地方使用。请诸位高谈阔论... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 加一個控件UP:TQuery,設定databaseName,UP.SQl.Text :='update XXX.db set 字段=... where ...UP.ExecSQL; 当Query的数据集为只读的时候,如果要修改数据,可以利用UpdateSql.1.将Query 的CacheUpdate设为True;UpdateObject设为UpdateSql1;2.双击Updatesql1弹出编辑器,在'sql'标签中编写修改数据的sql语句如: update temptable set custNo = :custNo where custNo = :OLD_custNo3.然后在程序中修改数据;如;Query1.edit; Query1.FieldByname('Field1').asstring:='ff'; Query1.post; Query1.ApplyUpdates;如此OK,即可改变数据库中的值。原理:Query1的数据集虽然是只读的,但利用缓冲(CacheUpdate)可以将修改值保存在其Delta中后用Post,ApplyUpdates来将修改值更新至实际数据库中的值.此时Query1将根据操作(修改删除插入从UpdateSql中寻找相应的SQl语句,并通过BDE传递至后台数据库中实际执行,这样达到修改只读数据集的目的。Query.sql.add('select * from table1 as T join Table2 as T2' )Query.open;//该数据集即为只读 yesxwl() 兄:能不能给个例子:看懂了就给分 TQuery和UpdateSQL相连,设置CachUpdates为True,然后指定SQL语句,updateSql的作用就是用缓存,修改后不是马上更新到数据库中的,一定要用ApplyUpdates才会存入库中,用post他还在缓存中, 因为主要是设置属性,源码很简单和普通的一样.操作步骤:1.拖拉3个控件:Tquery,Tdatabase,TUpdateSql,名分别为:query1,database1,UpdateSql1(BDE面板上)2.设置Database1属性:aliaseName:DBDEMOS ,DatabaseName:DB, 设置Query1属性:DataBaseName:=DB, SQL:='Select C.*,o.* from Customer as c join orders as o on C.Custno=O.custno' CacheUpdate设为True;UpdateObject设为UpdateSql1;3.双击Updatesql1控件,弹出对话框;按generate Sql,切换至'sql'标签选择Modify 修改sql语句:update customerset CustNo = :CustNo, Company = :Company, Addr1 = :Addr1, Addr2 = :Addr2, City = :City, State = :State, Zip = :Zip, Country = :Country, Phone = :Phone, FAX = :FAX, TaxRate = :TaxRate, Contact = :Contact, LastInvoiceDate = :LastInvoiceDatewhere CustNo = :OLD_CustNo 按确定 4.拖拉TBotton,TDBGRid,TDataSource至窗体名为(Btn1,Grid1,Datasource1)连接Grid1.datasource:=Datasource1;Datasource1.dataset:=Query15.BtnOnlick事件: query1.open; Query1.First Query1.edit; Query1.FieldByname('Company').asstring:='company china'; Query1.post; Query1.ApplyUpdates; yesxwl() 兄:你给的例子:第二步: 2.设置Database1属性: aliaseName:DBDEMOS, DatabaseName:DB, 设置Query1属性: DataBaseName:=DB, SQL:='Select C.*,o.* from Customer as c join orders as o on C.Custno=O.custno' CacheUpdate设为True;UpdateObject设为UpdateSql1; Updatesql1控件: 选择Modify 修改sql语句: update customer set CustNo = :CustNo, Company = :Company, Addr1 = :Addr1, Addr2 = :Addr2, City = :City, State = :State, Zip = :Zip, Country = :Country, Phone = :Phone, FAX = :FAX, TaxRate = :TaxRate, Contact = :Contact, LastInvoiceDate = :LastInvoiceDate where CustNo = :OLD_CustNo 问题1:设置Query1属性: SQL语句中customer和order是不是主细表关系;通过custno外关键字联系? 要不要设置主细表关系呀?customer是主表,order是细表 就是说:Updatesql1控件:是用于主细表的场合,通过主表去更改子表呀?2:Updatesql1控件: Modify : sql语句中以上参数,字段没有赋值呀,也就是说它们是通过什么赋值的?3.query1中sql是要显示custno,order中所有字段在TDBGRidk中, 为什么要显示两个表的数据呢,而不显示其中一个表呢?4.你的update customer部分 set CustNo = :CustNo,而where部分 CustNo = :OLD_CustNo 怎么理解5,Updatesql1控件:是更改custom表呀,只是一个表;为什呢?可联系1.问讲讲呀以上也许是我不懂,问得互相矛盾,你可以细细讲述,不够分再另加100给你。谢谢 1.updatesql用于数据集是只读, 不能用正常的方法直接修改 我举的例子是从两个表选出的数据,是只读的 只是为了说明updatesql的用途.其他任何只读数据集都可以用updatesql来修改2.对数据集中数据的赋值是通过其他任何一种修改数据的方法进行,和其他的数据修改一样, 如FieldByName('custno').asstring:='ffff'或通过DBEDit,dbgrid 等等,也就是只读的数据集从表面上和其他数据集没什么两样.只是在更新修改的数据时,新赋的值自动赋给updatesql的sql 语句中的参数如:custno等,然后updatesql自动执行sql语句更新后台数据库3.这个只是根据你的需要,因为只读数据集通常是从两个表中选出的数据,4.:custNo参数接受的是你的要赋的新值 .如果你修改的正好是where 内的关键字段,如果用where custno=:custno此时:custno是新值,那么sql语句就无法找到原来的记录了.为了找到原来的那条记录就要用此记录关键字段未改变前的数据值,updatesql自动记录各字段的原值,以:old_字段名来表示如:old_Custno 。5.要更改那个表,可以在sql语句中from 表名 来指定。不知我说得是否能让你明白? 大概晓得了,4。中的where部分中的custno=:custno是custom表中的主关键字是吗?where中通常写入是要修改的表的主关键字是吗? 所有字段都可以进行修改,只是利用主关键字来定位唯一的记录.如果没有主关键字就需要个字段组合起来定位直至所有字段,如:where custno=:Old_custNo and company=:old_company and …… Updatesql1控件: 选择Modify 修改sql语句: update customer set CustNo = :CustNo, Company = :Company, Addr1 = :Addr1, Addr2 = :Addr2, City = :City, State = :State, Zip = :Zip, Country = :Country, Phone = :Phone, FAX = :FAX, TaxRate = :TaxRate, Contact = :Contact, LastInvoiceDate = :LastInvoiceDate where CustNo = :OLD_CustNo 还有一点不懂呀:如上:Updatesql1控件:中参数要赋值,在哪里进行赋值呢?(哪个dataset中:table? or query? orUpdatesql中? )Updatesql1控件中sql语句是事先写的呀???是不是在qurey or table 的post方法前用FieldByName('...').asstring之类语句赋值呢? 程序在运行时,当以数据集进行确认更新时(Post),updatesql自动根据你对选择的数据集(如: query)的修改(modify,insert,delte)进行判断,选择相应的sql语句,并将你修改的数据(保存在缓冲中)自动赋值给参数.然后执行sql语句.你对数据的修改其实都保存在缓冲中,BDE都赋予了名字,如原值用oldvalue,新值NewValue等,宁关就能将这些值与updatesql中的参数一一对应,不需要用户干涉. 也就是说UpdateSql控件中的sql语句是不用自己赋值的是吧?thank you 顺便问一下你是用Delphi6.0吧?用D6+bde+什么大型数据库呀? 是的,不用自己赋值以前用d6,现在d7+bde+sql server 2k bde与sql server2000有冲突呀。bde只支持db_library,microsoft已不支持此库更新。你是怎么用的。 yesxwl() 兄:t谢谢你呀,我还有一个问题你可以参与呀:关于database的事务问题我会放贴子 edit控件如何实现点击换图片? delphi中有这个功能么? 用SocketConnection做三层,在服务端如何得到客户的机器名或用户名 向大家请教一个关于通过网络访问SQL服务器的问题? 用EncodeDate出错在线等待! 这句SQL应怎么写? 关于木马免杀和反启发,很底层的东西,高手进 光纤网络问题,急 我想简单的加密password应该用什么算法? delphi中如何实现汉字分行问题 请问:如何从query或table中查到对应表的某个字段的字段类型,谢谢 高分请教:请问用delphi怎样把AutoCAD做的图像存到数据库,最好有实例参考。谢谢,分不够再加
UP.SQl.Text :='update XXX.db set 字段=... where ...
UP.ExecSQL;
1.将Query 的CacheUpdate设为True;UpdateObject设为UpdateSql1;
2.双击Updatesql1弹出编辑器,在'sql'标签中编写修改数据的sql语句如:
update temptable set custNo = :custNo where custNo = :OLD_custNo
3.然后在程序中修改数据;
如;Query1.edit;
Query1.FieldByname('Field1').asstring:='ff';
Query1.post;
Query1.ApplyUpdates;
如此OK,即可改变数据库中的值。原理:Query1的数据集虽然是只读的,但利用缓冲(CacheUpdate)可以将修改值保存在其Delta中后用Post,ApplyUpdates来将修改值更新至实际数据库中的值.此时Query1将根据操作(修改删除插入从UpdateSql中寻找相应的SQl语句,并通过BDE传递至后台数据库中实际执行,这样达到修改只读数据集的目的。Query.sql.add('select * from table1 as T join Table2 as T2' )
Query.open;//该数据集即为只读
看懂了就给分
1.拖拉3个控件:Tquery,Tdatabase,TUpdateSql,名分别为:query1,database1,UpdateSql1
(BDE面板上)
2.设置Database1属性:aliaseName:DBDEMOS ,DatabaseName:DB,
设置Query1属性:DataBaseName:=DB,
SQL:='Select C.*,o.* from Customer as c join orders as o on C.Custno=O.custno'
CacheUpdate设为True;UpdateObject设为UpdateSql1;3.双击Updatesql1控件,弹出对话框;按generate Sql,切换至'sql'标签
选择Modify 修改sql语句:
update customer
set
CustNo = :CustNo,
Company = :Company,
Addr1 = :Addr1,
Addr2 = :Addr2,
City = :City,
State = :State,
Zip = :Zip,
Country = :Country,
Phone = :Phone,
FAX = :FAX,
TaxRate = :TaxRate,
Contact = :Contact,
LastInvoiceDate = :LastInvoiceDate
where
CustNo = :OLD_CustNo
按确定
4.拖拉TBotton,TDBGRid,TDataSource至窗体名为(Btn1,Grid1,Datasource1)
连接Grid1.datasource:=Datasource1;Datasource1.dataset:=Query1
5.BtnOnlick事件:
query1.open;
Query1.First
Query1.edit;
Query1.FieldByname('Company').asstring:='company china';
Query1.post;
Query1.ApplyUpdates;
第二步:
2.设置Database1属性:
aliaseName:DBDEMOS,
DatabaseName:DB,
设置Query1属性:
DataBaseName:=DB,
SQL:='Select C.*,o.* from Customer as c join orders as o on C.Custno=O.custno'
CacheUpdate设为True;UpdateObject设为UpdateSql1; Updatesql1控件:
选择Modify 修改sql语句:
update customer
set
CustNo = :CustNo,
Company = :Company,
Addr1 = :Addr1,
Addr2 = :Addr2,
City = :City,
State = :State,
Zip = :Zip,
Country = :Country,
Phone = :Phone,
FAX = :FAX,
TaxRate = :TaxRate,
Contact = :Contact,
LastInvoiceDate = :LastInvoiceDate
where
CustNo = :OLD_CustNo
问题
1:设置Query1属性:
SQL语句中customer和order是不是主细表关系;通过custno外关键字联系?
要不要设置主细表关系呀?customer是主表,order是细表
就是说:Updatesql1控件:是用于主细表的场合,通过主表去更改子表呀?
2:Updatesql1控件:
Modify :
sql语句中以上参数,字段没有赋值呀,也就是说它们是通过什么赋值的?3.query1中sql是要显示custno,order中所有字段在TDBGRidk中,
为什么要显示两个表的数据呢,而不显示其中一个表呢?4.你的update customer部分
set
CustNo = :CustNo,
而
where部分
CustNo = :OLD_CustNo
怎么理解
5,Updatesql1控件:是更改custom表呀,只是一个表;为什呢?可联系1.问讲讲呀以上也许是我不懂,问得互相矛盾,你可以细细讲述,不够分再另加100给你。谢谢
2.对数据集中数据的赋值是通过其他任何一种修改数据的方法进行,和其他的数据修改一样, 如FieldByName('custno').asstring:='ffff'或通过DBEDit,dbgrid 等等,也就是只读的数据集从表面上和其他数据集没什么两样.只是在更新修改的数据时,新赋的值自动赋给updatesql的sql 语句中的参数如:custno等,然后updatesql自动执行sql语句更新后台数据库
3.这个只是根据你的需要,因为只读数据集通常是从两个表中选出的数据,
4.:custNo参数接受的是你的要赋的新值 .如果你修改的正好是where 内的关键字段,如果用where custno=:custno此时:custno是新值,那么sql语句就无法找到原来的记录了.为了找到原来的那条记录就要用此记录关键字段未改变前的数据值,updatesql自动记录各字段的原值,以:old_字段名来表示如:old_Custno 。
5.要更改那个表,可以在sql语句中from 表名 来指定。
不知我说得是否能让你明白?
4。中的where部分中的custno=:custno是custom表中的主关键字是吗?
where中通常写入是要修改的表的主关键字是吗?
选择Modify 修改sql语句:
update customer
set
CustNo = :CustNo,
Company = :Company,
Addr1 = :Addr1,
Addr2 = :Addr2,
City = :City,
State = :State,
Zip = :Zip,
Country = :Country,
Phone = :Phone,
FAX = :FAX,
TaxRate = :TaxRate,
Contact = :Contact,
LastInvoiceDate = :LastInvoiceDate
where
CustNo = :OLD_CustNo
还有一点不懂呀:
如上:
Updatesql1控件:中参数要赋值,在哪里进行赋值呢?
(哪个dataset中:table? or query? orUpdatesql中? )
Updatesql1控件中sql语句是事先写的呀???
是不是在qurey or table 的post方法前
用FieldByName('...').asstring之类语句赋值呢?
你对数据的修改其实都保存在缓冲中,BDE都赋予了名字,如原值用oldvalue,新值NewValue等,宁关就能将这些值与updatesql中的参数一一对应,不需要用户干涉.
顺便问一下你是用Delphi6.0吧?用D6+bde+什么大型数据库呀?
以前用d6,现在d7+bde+sql server 2k
关于database的事务问题我会放贴子