向数据库(oracle)中添加记录的问题 (50分)

  • 主题发起人 主题发起人 kds
  • 开始时间 开始时间
K

kds

Unregistered / Unconfirmed
GUEST, unregistred user!
var
ID:string;
........
ID:='1';
with ADOQuery1 do
begin
CLose;
SQL.Clear;
SQL.Add('insert into goods values(:a,:b,:c,:d,:e)');
Parameters.Items[0].Value := ID;
Parameters.Items[1].Value := Edit1.Text;
Parameters.Items[2].Value := Edit2.Text;
Parameters.Items[3].Value := Edit3.Text;
Parameters.Items[4].Value := Edit4.Text;
ExecSQL;
end;

错误代码提示:
----------------------------------------
程序引起EOLeException with message 如下;
应用程序定义parameter对象的方式不适当
----------------------------------------
这样操作有问题吗?
为什么编辑框中,如Edit1的Text为空,添加数据就会出现错误。
能不能给一个向oracle数据库添加数据的例子,使用ADOQuery控件
 
如Edit1的Text为空,添加数据就会出现错误。
~
如果只是为空的时候出错
恐怕和你的数据库设定的规则有关系巴

贴出出错的信息
 
如果Edit1.Text为空,就和1参数的值类型不匹配了
 
你的写法是对的。不过还不是很好的写法。
你说的如果edit的text为空,出现错误,是因为类型为匹配的原因。
例如你的 第fields[1]字段为整数,试图插入一个''当然会出错。
至于添加数据的例子,只要将你的参数赋值语句改为
parameters.Items[1].Asinteger/Asstring/Asfloat.
具体选择哪个,看你的数据类型而定。
 
我试一下pcc_mmz1的方法
出错代码已经贴出来了
 
至于添加数据的例子,只要将你的参数赋值语句改为
parameters.Items[1].Asinteger/Asstring/Asfloat
这种方法不行,说是AsInteger/AsString 没有定义
 
AsInteger/AsString
是啊,这两个到底是哪个系统单元的,怎么代码自动完成功能不能生成他们啊
 
都是
你手写
看看系统编译是否能通过
 
手写能通过?可是为什么呢?这是什么意思?
 
Parameters是一个参数对象列表。记住,是对象,也就是必须要创建并赋好属性。
在ide里,delphi已经帮你做好,但是你是动态增加的,所以我想你要创建所有的
参数对象。具体方法,请参考帮助。
 
我今天试了一下,如果设计时设置参数的值(当前需要在object inspector加入参数),
是行的。如果你在程序中指定,就不行。我想可能时ado处理 ''时的bug吧。按理
ADOQuery1.Parameters.Items[0].value是一个variant的类型,可以处理任意类型变量值。
 
ADOQuery1.Parameters.Items[0].value是一个variant的类型,可以处理任意类型变量值。
这种说法是正确的,但是,对于为''的情况,到底应该怎么处理?
 
我一般的做法是自已去做一个SQL字串
s_sql:string;
s_sql:='insert into goods values(''1'', ';
s_sql:=''''+edit1.text+''',';
s_sql:=''''+edit2.text+''',';
s_sql:=''''+edit3.text+''',';
s_sql:=''''+edit4.text+''')';
with adoquery1 do
begin
close;sql.clear;
sql.add(s_sql);
try
open;
except
.....
end ;
end;

以上代码中所有都是单引号',不是双引号。如果你数据库字段的类型是数值,
则将单引号去掉,如果你数据库字段的类型是日期型,则你要用to_date函数。
那s_sql拼起来更复杂点;目的是为了避免出现ADOQUERY参数处理中出现的这些
莫名其妙的问题。用BDEQUERY可以用asstring,asinteger,asdate,asdatetime;
ADOQUERY中好象没有。
 
如果是空的话,不能使用这种方式,要使用null。
干脆这样做:
查询哪些字段不为空,如果有数据库限制不能为空的,但内容为空,提示错误并定位。
对于那些不为空的字段,使用两个字符串变量,一个保存各字段名,一个保存各字段值,并
按SQL语句的要求进行组合。
在查询结束后,再根据两个变量组合插入的SQL语句。
 
其实这些只是思路,具体的还要根据你字段的类型来操作;
但是oracle数据库中如果是char或是varchar2是可以在为空的情况下用''的。
我上面的代码是可以通过的。
 
问题虽然没有得到最好的解答,但是还是谢谢大家!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部