下面的代码,我是想实现往access数据表中写入数据,编译室通过了的,但是在运行完 Open;时提示错误:Project a2.exe raised exception class EDatabaseError with message'ADOquery1:Field'Wavenumber'not found'.
请问是 sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
这句话的问题吗?怎么改呢?
with ADOQuery1 do
try
begin
close;
sql.Clear;
sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
// prepared;
Open;--------错误出现
if ADOQuery1.RecordCount>0 then
maxID:=ADOQuery1.Fields.Fields[0].AsInteger
else
maxID:=1;
ADOQuery1.close; end;
begin
close;
sql.Clear;
sql.add('insert into spectrum values(:ID,:Wavenumber,:Intensity)');
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=maxID+1;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
end;
finally;
end; //end with
请问是 sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
这句话的问题吗?怎么改呢?
with ADOQuery1 do
try
begin
close;
sql.Clear;
sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
// prepared;
Open;--------错误出现
if ADOQuery1.RecordCount>0 then
maxID:=ADOQuery1.Fields.Fields[0].AsInteger
else
maxID:=1;
ADOQuery1.close; end;
begin
close;
sql.Clear;
sql.add('insert into spectrum values(:ID,:Wavenumber,:Intensity)');
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=maxID+1;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
end;
finally;
end; //end with
解决方案 »
- 这个delphi 事件怎么写?
- 如何把一个ListView中选中复选框的记录加到另一个ListView中?
- 请教在Access 中修改表名的SQL 语句是什么?
- 为什么设置Timage及其中的Tbitmap某种颜色透明后,在2000下运行正常,在98下却不透明了??怎么办??
- 为什么和Dephi 5开发人员指南说的不同?
- 关于动态数组声明,难!!!!!!
- 我的数据库中有一个完全格式的时间字段'2002-09-16 13:20:55' 可是在DBGrid中只显示2002-09-16,请问各位大侠如何才能将该字段显示完全
- 如何将dbgrid的某列固定住?
- Delphi7可以用Delphi7开发出来吗
- 赶问各位老大如何在delphi下画各种线型如铁路
- delphi打印问题,在线等.......
- delphi 关于线程的问题 请教大虾!
这句话的问题吗?怎么改呢?
不是這裏的問題。
maxID:=ADOQuery1.Fields.Fields[0].AsInteger
else
maxID:=0; //原来为1,应该改为0
with ADOQuery1 do
try
begin
close;
sql.text := 'select max(ID) as ID from spectrum ';//取字段ID的最大值
Open;--------错误出现
if ADOQuery1.RecordCount>0 then
maxID:=ADOQuery1.Fields.Fields[0].AsInteger
else
maxID:=1;
end;
for i:=0 to 2090 do
begin
try
adoconnection1.BeginTrans;
adoquery1.append;
fieldbyname('ID').value := maxID+1;
fieldbyname('Wavenumber').value := arrwave[i];
fieldbyname('Intensity').value := arrintensity[i];
adoquery1.post;
adoquery1.next;
ADOConnection1.CommitTrans ;
showmessage('done');
except
begin
showmessage('同步出错');
ADOConnection1.RollbackTrans ;
end;
end;
......
begin
close;
sql.Clear;
sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:ID,:Wavenumber,:Intensity)'); //这句修改一下
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=maxID+1;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功'); //这句放这里有问题的, 最多可能会弹出2091次对话框
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
end;
with ADOQuery1 do
try
begin
close;
sql.Clear;
sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
// prepared;
Open;--------错误出现
if ADOQuery1.RecordCount>0 then
maxID:=ADOQuery1.Fields.Fields[0].AsInteger
else
maxID:=1;
ADOQuery1.close; end;
begin
close;
sql.Clear;
sql.add('insert into spectrum values(:ID,:Wavenumber,:Intensity)');
// ('insert into spectrum(ID,:Wavenumber,:Intensity)values(ID,Wavenumber,Intensity))
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=maxID+1;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
end;
finally;
end; //end with
還有你一定要搞清楚參數跟字段完全是二回事。
还有麻烦个高手哥哥,我的这段程序实现的是 往数据表中写入横纵坐标,有三个字段:ID,Wavenumber--横,Intensity--纵,共有2090组数据,ID是我的横纵坐标生成图的编号,即2090组数据应具有相同的ID,请高手哥哥看看代码写的对吗???多谢多谢多谢!!
[/Quote我的2090组数据(Wavenumber-横坐标,Intensity-纵坐标)分别存放在arrwave和arrintensity两个数组中,我要把这两个数组的值分别写进表字段wavenumber和intensity中,是这个样子的~~~~~~我表达好像有问题,请哥哥们见谅~~~
with ADOQuery1 do
try
begin
close;
sql.Clear;
sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
// prepared;
Open;--------错误出现
if ADOQuery1.RecordCount>0 then
maxID:=ADOQuery1.Fields.Fields[0].AsInteger
else
maxID:=1;
ADOQuery1.close; end;
begin
close;
sql.Clear;
sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:ID,:Wavenumber,:Intensity)');
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=maxID+1;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
end;
finally;
end; //end with
try
begin
close;
sql.Clear;
sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
// prepared;
Open;--------错误出现
if ADOQuery1.RecordCount>0 then
maxID:=ADOQuery1.Fields.Fields[0].AsInteger
else
maxID:=1;
ADOQuery1.close; end; 取最大值時換一個QUERY,認真看了下,應該是你將這個數據集靜態化了字段了。
提示错误:Project a2.exe raised exception class EDatabaseError with message'ADOquery1:Field'Wavenumber'not found'.
我是单步运行,在运行完
sql.add('select max(ID) as ID from spectrum ');//取字段ID的最大值
// prepared;
Open;--------错误出现
如果 2090组数据要有相同的ID ,相同的(Wavenumber-横坐标,Intensity-纵坐标)
那么上面的一个就可以解难决
如果 说其中一条出错要全部回滚的话 就把 For to Do 放到 adoconnection1.BeginTrans; 后面
我的意思是讓你再放一個ADOQUERY控件來取ID的最大值,不要再用ADOQUERY1, 因為ADOQUERY1的 fields 已經讓你靜態化了字段。
领会了starluck ,你真牛!!以下是我改的,你看这回对了吧? with ADOQueryID do
try
begin
close;
sql.Clear;
sql.add('select max(ID) as ID from spectrum ');
// prepared;
Open;
if ADOQueryID.RecordCount>0 then
maxID:=ADOQueryID.Fields.Fields[0].AsInteger
else
maxID:=1;
h:=maxID+1;
ADOQueryID.close;
end; with ADOQuery1 do
begin
close;
sql.Clear;
sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:h,:arrwave[i],:arrintensity[i])');
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=h;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
try
begin
close;
sql.Clear;
sql.add('select isNull(max(ID),1) as ID from spectrum ');
Open;
if ADOQueryID.RecordCount>0 then
maxID:=ADOQueryID.Fields.Fields[0].AsInteger
else
maxID:=1; // 這二行有點怪。如果為空即為1,那麼就不應該再需要相加了,也就是說如果在空表的情況你這個SQL會出ID號跳一個號的情況。其它目前沒有發現什麼問題。
h:=maxID+1;
ADOQueryID.close;
end; with ADOQuery1 do
begin
close;
sql.Clear;
sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:h,:arrwave[i],:arrintensity[i])');
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=h;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
是有问题~~~~慧眼!修改后应该是这个个样子,但是楼上的错误还是存在~~~~~ with ADOQueryID do
try
begin
close;
sql.Clear;
sql.add('select max(ID) as ID from spectrum ');
// prepared;
Open;
if ADOQueryID.RecordCount>1 then
maxID:=ADOQueryID.Fields.Fields[0].AsInteger+1
else
maxID:=1;
ADOQueryID.close;
end; with ADOQuery1 do
begin
close;
sql.Clear;
sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:maxID,:arrwave[i],:arrintensity[i])');
for i:=0 to 2090 do
begin
Parameters.ParamByName('ID').Value:=maxID;
Parameters.ParamByName('Wavenumber').Value:=arrwave[i];
Parameters.ParamByName('Intensity').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end;
with ADOQueryID do
try
begin
close;
sql.Clear;
sql.add('select isNull(max(ID),1) as ID from spectrum ');
Open;
if ADOQueryID.RecordCount>0 then
maxID:=ADOQueryID.Fields.Fields[0].AsInteger
else
maxID:=1; // 這二行有點怪。如果為空即為1,那麼就不應該再需要相加了,也就是說如果在空表的情況你這個SQL會出ID號跳一個號的情況。其它目前沒有發現什麼問題。
h:=maxID+1;
ADOQueryID.close;
end; with ADOQuery1 do
begin
close;
sql.Clear;
sql.add('insert into spectrum (ID,Wavenumber,Intensity) values(:A,:B,:C)');
for i:=0 to 2090 do
begin
Parameters.ParamByName('A').Value:=h;
Parameters.ParamByName('B').Value:=arrwave[i];
Parameters.ParamByName('C').Value:=arrintensity[i];
try
prepared;
ExecSQL;
ShowMessage('成功');
except
on e: Exception do
begin
ShowMessage('出错');
end;
end;
end; 真差點讓你氣死。
參數的名字一點要對應上
不過你的二個SHOWMESSAGE你最好根據你的需要改進下,不然2090次提示,人會瘋掉的。