两周啦,就为了一句SQL语句的问题,我上来问有不下十次,可还没有解决!!!!!!(65分)

  • 主题发起人 主题发起人 阿虫
  • 开始时间 开始时间

阿虫

Unregistered / Unconfirmed
GUEST, unregistred user!
我的窗口上有个EDIT1、EDIT2,我通过它们给数据库输入值表号和序号的记录。
我希望当输入的EDIT中的数值(即表号的数值)在数据库中存在时,出现一个提示,询问是覆盖还是放弃。如果
选择是,则用EDIT中的数值覆盖原数据,同时序号的值出输入,选否的话退出。

begin
with dn do//DN是数据模块,放的QUERY1;

begin
query1.SQL.Clear;
query1.SQL.Add('select * from 抄表信息库 where bh=:key_0');
query1.requestlive:=true;
query1.Params[0].asstring:=edit1.text;
query1.active:=true;
if query1.recordcount=0 then
query1.append
else
begin
if application.messagebox(pchar('表号已存在,覆盖吗?'),'提示',mb_yesno+mb_iconquestion)=idyes then
query1.edit;
end;
if query1.State in[dsedit,dsinsert] then
begin
query1.sql.add('insert into 抄表信息库(xuh) values(''EDIT2。TEXT'')');
query1.post;
end;
end;
end;

上面这段程序提示说是数据不处于EDIT或INSERT状态,我改过,可改来改去不行。
那位老兄帮我看看如何改才对,如果有更好的方法帮我写出来,我真的没信心啦。前面有几个朋友
帮我写了同段,可我一试总出现这呀那呀的问题,最好请你在你的机子上做个小数
据库试一下,PARADOX数据库的,通过了给我讲讲,多谢啦!我已经花了三佰分的冤枉分啦。
 
with Query1 do
begin
SQL.Clear;
SQL.Add('select * from 抄表信息库 where bh='''+Edit1.Text+'''');
Open;
if (recordcount=0) or ((recordcount>0) and (messagebox('表号已存在,覆盖吗?','提示',mb_yesno+mb_iconquestion)=idyes)) then
begin
SQL.Clear;
SQL.append('insert into 抄表信息库(xuh) values('''+EDIT2.TEXT+''')');
ExecSQL
end
end;
 
你用混了Tquery的属性,如果你想用TQuery的post,则不能增加插入语句,
如果你想用插入语句,就不能用post进行提交,
必须用execsql(自己看看是那个,具体我不记的了)函数提交。
 
...
if query1.recordcount=0 then
query1.append
else
...
错在这句话,对Paradox数据库来说,query查询出来的结果是不能用Edit、Insert、append
等编辑语句的
 
我的一段代码,你参考一下吧,思路就是检索然后在确定是修改还是插入,不过我直接用的
SQL操作的。

procedure TDBOperate.Execute_F104(aData: TStrings); //机构表
begin
with FQuery do
try
Close;
SQL.Text := ' SELECT COUNT(*) '
+ ' FROM 收费机构表 '
+ ' WHERE 机构编码 = :机构编码 ';

ParamByName('机构编码').AsString := aData.Values['机构编码'];
Open;
if Fields[0].AsInteger = 0 then
begin
SQL.Text := ' INSERT INTO 收费机构表( '
+ ' 机构编码, '
+ ' 机构名称, '
+ ' 机构类型, '
+ ' 上级机构, '
+ ' 网络地址, '
+ ' 开通标志) '
+ ' VALUES( '
+ ' :机构编码, '
+ ' :机构名称, '
+ ' :机构类型, '
+ ' :上级机构, '
+ ' :网络地址, '
+ ' :开通标志); ';
end
else
begin
SQL.Text := ' UPDATE 收费机构表 '
+ ' SET '
+ ' 机构编码 =:机构编码, '
+ ' 机构名称 =:机构名称, '
+ ' 机构类型 =:机构类型, '
+ ' 上级机构 =:上级机构, '
+ ' 网络地址 =:网络地址, '
+ ' 开通标志 =:开通标志 '
+ ' WHERE '
+ ' 机构编码 = :机构编码; ';
end;

Close;
Prepare;
ParamByName('机构编码').AsString := StrToStrDefault(aData.Values['机构编码']);
ParamByName('机构名称').AsString := StrToStrDefault(aData.Values['机构名称']);
ParamByName('机构类型').AsString := StrToStrDefault(aData.Values['机构类型']);
ParamByName('上级机构').AsString := StrToStrDefault(aData.Values['上级机构']);
ParamByName('网络地址').AsString := StrToStrDefault(aData.Values['网络地址']);
ParamByName('开通标志').AsString := StrToStrDefault(aData.Values['开通标志']);

ExecSQL;
except
on E: Exception do
begin
TLogFile.WriteLn('机构编码表操作失败, 错误信息="%s"', [E.Message]);
raise;
end;
end;
end;
 
唉!最好不要什么都要现成的。
原码如下:
with query1 do
begin
close;sql.clear;
sql.add('select * from 抄表信息库 where bh=:vbh');
parambyname('vbh').value:=edit1.text
open;
if recoredcount>0 then
if messagedlg('表号已存在,覆盖吗?',mtconformation,[mbYes,mbNo],0)=mrYes then
begin
close;sql.clear;
sql.add('update 抄表信息库 set xuh=:vxuh where bh=:vbh');
parambyname('vxuh').value:=edit2.text
parambyname('vbh').value:=edit1.text
execsql'
end
else
begin
close;sql.clear;
sql.add('insert into 抄表信息库 (xuh,bh) values (:vxuh,:vbh');
parambyname('vxuh').value:=edit2.text
parambyname('vbh').value:=edit1.text
execsql'
end;

 
应该用TQuery的Open方法,即
SQL.Add("sql sentence");
SQL.Prepare;
SQL.Open;
 
将你的代码改为如下:
begin
with dn do//DN是数据模块,放的QUERY1;

begin
query1.SQL.Clear;
query1.SQL.Add('select * from 抄表信息库 where bh=:key_0');
query1.requestlive:=true;
query1.Params[0].asstring:=edit1.text;
query1.active:=true;
if query1.recordcount=0 then
[red]//query1.append[/red]
[green]begin
query1.close;
query1.sql.clear;
query1.sql.add('insert into 抄表信息库(xuh) values(''EDIT2。TEXT'')');
query1.execsql;
end[/green]
else
begin
if application.messagebox(pchar('表号已存在,覆盖吗?'),'提示',mb_yesno+mb_iconquestion)=idyes then
[red]//query1.edit;
//end;
//if query1.State in[dsedit,dsinsert] then[/red]
[green]begin
query1.close;
query1.sql.clear;
query1.sql.add('insert into 抄表信息库(xuh) values(''EDIT2。TEXT'')');[/green]
[red]//query1.post;[/red]
[green]query1.execsql;[/green]
end;
end;
end;
 
你这样写肯定不对
if query1.State in[dsedit,dsinsert] then
begin
query1.sql.add('insert into 抄表信息库(xuh) values(''EDIT2。TEXT'')');
//上面这句改变了Query的 SQL,Query自动Disconnect 即Active为false了
//在Active为False时,执行post肯定是不行的
query1.post;
end;

这样做
if query1.State in[dsedit,dsinsert] then
begin
Query1.FieldByName(字段名).AsString:=Edit2.Text;
query1.post;
end;

 
这样太复杂了,告诉你个非常非常简单的办法。

放一个Query控件
设置SQL属性
设置Query.CachedUpdates为True
放一个UpdateSQL控件
设置DeleteSQL, InsertSQL, ModifySQL属性
将Query.UpdateObject属性关联到UpdateSQL控件
设置Query.Active为True
修改会暂存在客户端,需要真正更新到服务器的话调用Query.ApplyUpdates。

Ready! GO! :D

试试看吧!
另外,如果是用ADOQuery则可以直接编辑,不用作任何设置。
 
with Query1 do
begin
SQL.Clear;
SQL.Add('select * from 抄表信息库 where bh="'+ Edit1.Text + '"');
Open;
if ((recordcount>0) and (messagebox('表号已存在,覆盖吗?','提示',mb_yesno+mb_iconquestion)=idyes)) then
begin
SQL.Clear;
SQL.Add('UPDATE 抄表信息库 SET xuh = "' + EDIT2.TEXT + "' WHERE bh="' + Edit1.Text + '"');
ExecSQL
end
end;
//OK?
 
首先我多谢大家的热心帮助。
我先试了LEECHANGE老兄的方法,结果在编译时通不过,
这句里面字符类型不匹配//if (recordcount=0) or ((recordcount>0) and (messagebox('表号已存在,覆盖吗?','提示',mb_yesno+mb_iconquestion)=idyes)) then
提示:[Error] Unit1.pas(37): Incompatible types: 'HWND' and 'String'
[Error] Unit1.pas(37): Incompatible types: 'Integer' and 'PChar'
然后我试了whitehorse老兄的方法:
结果编译通过;
可执行时没反应,咋回事呀。出没什么提示,我又查了一遍自认为没什么问题。
不过WHITEHORSE老兄的程序中我改了一点点,就是有的分号没写,还有一个:
mtconformation,我想因该是:mtInformation;不会和这个有关吧:
希望WHITEHORSE老兄还在。
 
with Query1 do
begin
SQL.Clear;
SQL.Add('select * from 抄表信息库 where bh='''+Edit1.Text+'''');
Open;
if (recordcount=0) or ((recordcount>0) and (application.messagebox('表号已存在,覆盖吗?','提示',mb_yesno+mb_iconquestion)=idyes)) then
begin
SQL.Clear;
SQL.append('insert into 抄表信息库(xuh) values('''+EDIT2.TEXT+''')');
ExecSQL
end
end;

 
query1.SQL.Clear;
query1.SQL.Add('select * from 抄表信息库 where bh=:key_0');
query1.requestlive:=true;
query1.Params[0].asstring:=edit1.text;
query1.[red]open;[/red]
[red]if query1.recordcount <> 0 then begin
if application.messagebox(pchar('表号已存在,覆盖吗?'),'提示',mb_yesno+mb_iconquestion)<>idyes then
exit;
query1.sql.add('insert into 抄表信息库(xuh) values(' + EDIT2。TEXT + ')');
query1.execsql;
end;[/red]
 
现在向大家通报我的实验结果:
对于AVENIR老兄的程序:
if query1.State in[dsedit,dsinsert] then
begin
Query1.FieldByName(字段名).AsString:=Edit2.Text;//在这里,编译通不过,提示说我的字段名没有申报。
query1.post; //以我的水平我知道,好象这是直接操作数据表格的方法。

WINBELL老兄的写法我看不太明白,句子中[RED]、[GREEN]是什么意思,我没见过,直接用好象也不行,是不是还要
怎么定义一下才行呢,请那位老兄给我讲讲。

[red]//query1.append[/red]
[green]begin
还有PANIF老兄也是这样写的,我都看不明白,本人才输学浅,望各位老兄不吝啬赐教啊。
 
begin
with dn do//DN是数据模块,放的QUERY1;

begin
query1.SQL.Clear;
query1.SQL.Add('select * from 抄表信息库 where bh=:key_0');
query1.requestlive:=true;
query1.Params[0].asstring:=edit1.text;
query1.active:=true;
if query1.recordcount=0 then
//query1.append
begin
query1.close;
query1.sql.clear;
query1.sql.add('insert into 抄表信息库(xuh) values('''+EDIT2。TEXT+''')');
query1.execsql;
end
else
begin
if application.messagebox(pchar('表号已存在,覆盖吗?'),'提示',mb_yesno+mb_iconquestion)=idyes then
//query1.edit;
//end;
//if query1.State in[dsedit,dsinsert] then
begin
query1.close;
query1.sql.clear;
query1.sql.add('update 抄表信息库 set xuh= '''+EDIT2。TEXT+'''');
//query1.post;
query1.execsql;
end;
end;
end;
 
何苦那么复杂?照我说的步骤作,可以直接用数据敏感控件来操作数据库,几乎不用写代码的。
 
[RED]、[GREEN]是大富翁的字体颜色标记,用时把它去掉就行了,如果用ie6选热情型
进大富翁就知道怎么回事了。
你既然用了query ,那就试试用sql语句完成数据保存,用updata或insert into来更新数据
这样保险些,我的代码没有试,你看看思路吧
 
traveller 老兄的方法我很感兴趣呀,毕竟自已是个菜鸟,可是苦于不知其理呀,不用写代码如何操作呢,不明白,不明白,
是否可以示范一二呢。能简单最好了,复杂的对我这样的菜鸟来说真是太苦了,遇到问题要费几倍的力才能解决呀,比如说这个问题。
 
->WINBELL老兄的写法我看不太明白,句子中[RED]、[GREEN]是什么意思,我没见过,直接用好象也不行,是不是还要
->怎么定义一下才行呢
什么也不要定义,只要把你看到的那些[red]等去掉就行了。这是DFW中的颜色定义。
至于想不写代码就什么都搞定,就不要再想了。那种方法一般在不能直接编辑的数据集上使用,
但一样要写代码。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
687
import
I
后退
顶部