代码如下,点击Button1第一次插入可以成功,然后修改各edit.text再次插入记录就会出错。三天了,百思不得其解,望指点~~~~~~~~~谢谢
错误信息“Exception class EDatabaseError with message 'ADOCommand1: Parameter 'ljh' not found'”procedure TInForm.Equal();//参数赋值
begin
ADOCommand1.Parameters.ParamByName('ljh').Value:=Edit1.Text;
ADOCommand1.Parameters.ParamByName('mc').Value:=Edit2.Text;
ADOCommand1.Parameters[2].Value:=Edit3.Text;
ADOCommand1.Parameters[3].Value:=Edit6.Text;
if Edit8.Text='' then
begin
ADOCommand1.Parameters[4].Value.sl:=0;
end
else
begin
ADOCommand1.Parameters[4].Value:=StrToFloat(Edit8.text);
end;
if Edit9.Text='' then
begin
ADOCommand1.Parameters[5].Value:=0;
end
else
begin
ADOCommand1.Parameters[5].Value:=StrToFloat(Edit8.text);
end;
ADOCommand1.Parameters[6].Value:=DateTimePicker1.Date;
ADOCommand1.Parameters[7].Value:=ComboBox1.Text;
ADOCommand1.Parameters[8].Value:=Edit7.Text;
ADOCommand1.Parameters[9].Value:=Edit5.Text;
ADOCommand1.Parameters[10].Value:=Memo1.Text;
end;procedure TInForm.Button1Click(Sender: TObject);//插入记录
begin
Equal;
place:='ljh,pxh,mc,sl,dw,dj,ckdm,ckkw,bz';
sqlstr:=formatStr(place);
ADOCommand1.CommandText:='insert into [accessory] ([ljh],[pxh],[mc],[sl],[dw],[dj],[ckdm],[ckkw],[bz]) values ('+sqlstr+')';
ADOCommand1.Execute;
end;function TInForm.FormatStr(place:string):string;//构建SQL字符串
var
arr:TStringList;
i:Integer;
begin
arr:=TStringList.Create;
arr.DelimitedText:=place;
arr.Delimiter:=',';
for i:=0 to arr.Count-1 do
begin
case ADOCommand1.Parameters.FindParam(arr[i]).DataType of
ftString:
begin
Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
ftFloat:
begin
Result:=Result+FloatToStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
ftDateTime:
begin
Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
end;
end;
Result:=LeftStr(Result,Length(Result)-1);
end;
错误信息“Exception class EDatabaseError with message 'ADOCommand1: Parameter 'ljh' not found'”procedure TInForm.Equal();//参数赋值
begin
ADOCommand1.Parameters.ParamByName('ljh').Value:=Edit1.Text;
ADOCommand1.Parameters.ParamByName('mc').Value:=Edit2.Text;
ADOCommand1.Parameters[2].Value:=Edit3.Text;
ADOCommand1.Parameters[3].Value:=Edit6.Text;
if Edit8.Text='' then
begin
ADOCommand1.Parameters[4].Value.sl:=0;
end
else
begin
ADOCommand1.Parameters[4].Value:=StrToFloat(Edit8.text);
end;
if Edit9.Text='' then
begin
ADOCommand1.Parameters[5].Value:=0;
end
else
begin
ADOCommand1.Parameters[5].Value:=StrToFloat(Edit8.text);
end;
ADOCommand1.Parameters[6].Value:=DateTimePicker1.Date;
ADOCommand1.Parameters[7].Value:=ComboBox1.Text;
ADOCommand1.Parameters[8].Value:=Edit7.Text;
ADOCommand1.Parameters[9].Value:=Edit5.Text;
ADOCommand1.Parameters[10].Value:=Memo1.Text;
end;procedure TInForm.Button1Click(Sender: TObject);//插入记录
begin
Equal;
place:='ljh,pxh,mc,sl,dw,dj,ckdm,ckkw,bz';
sqlstr:=formatStr(place);
ADOCommand1.CommandText:='insert into [accessory] ([ljh],[pxh],[mc],[sl],[dw],[dj],[ckdm],[ckkw],[bz]) values ('+sqlstr+')';
ADOCommand1.Execute;
end;function TInForm.FormatStr(place:string):string;//构建SQL字符串
var
arr:TStringList;
i:Integer;
begin
arr:=TStringList.Create;
arr.DelimitedText:=place;
arr.Delimiter:=',';
for i:=0 to arr.Count-1 do
begin
case ADOCommand1.Parameters.FindParam(arr[i]).DataType of
ftString:
begin
Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
ftFloat:
begin
Result:=Result+FloatToStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
ftDateTime:
begin
Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
end;
end;
Result:=LeftStr(Result,Length(Result)-1);
end;
ADOCommand1.Parameters.ParamByName('ljh').Value:=Edit1.Text; 这句过不去,所以不知道第二次插入的时候SQL语句是否正确(第一遍是肯定正确的)。难道ADOCommand的参数执行一遍就会自动释放空间或者改变内存地址吗?难道ADOCommand的参数不可以重新赋值吗?前几天的出错提示不是找不到'ljh'参数,是个什么什么地址错误,嘿嘿,不知道为什么今天又变成找不到参数了。肯请高手指点为感~~~~~~procedure TInForm.Equal();//参数赋值
begin
ADOCommand1.Parameters.ParamByName('ljh').Value:=Edit1.Text;
ADOCommand1.Parameters.ParamByName('mc').Value:=Edit2.Text;
end; procedure TInForm.Button1Click(Sender: TObject);//插入记录
begin
Equal;
place:='ljh,mc;
sqlstr:=formatStr(place);
ADOCommand1.CommandText:='insert into [accessory] ([ljh],[mc] )values ('+sqlstr+')';
ADOCommand1.Execute;
end; function TInForm.FormatStr(place:string):string;//构建SQL字符串
var
arr:TStringList;
i:Integer;
begin
arr:=TStringList.Create;
arr.DelimitedText:=place;
arr.Delimiter:=','; // 这三句是将字符串以逗号为分隔符拆分为字符列表。
for i:=0 to arr.Count-1 do //这个循环判断ADOCommand参数的类型,以控制是否加入引号
begin
case ADOCommand1.Parameters.FindParam(arr[i]).DataType of
ftString:
begin
Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
ftFloat:
begin
Result:=Result+FloatToStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
ftDateTime:
begin
Result:=Result+QuotedStr(ADOCommand1.Parameters.ParamValues[arr[i]])+',';
end;
end;
end;
Result:=LeftStr(Result,Length(Result)-1); //去掉尾部逗号。
end;
帅锅都提醒你了,把SQL显示一下看看吧
第二次赋值这句都过不去,怎么能看到SQL.text,再说出错是因为再次为adocommd1的参数赋值时出错,又不是执行语句的时候出错。真是头痛,找了一天的资料,还是没搞定!我就不信找不出原因来大不了俺狠狠啃下汇编
在第一次执行后,ADOCommand1.CommandText 改变了,因为下面这句:
ADOCommand1.CommandText:='insert into [accessory] ([ljh],[pxh],[mc],[sl],[dw],[dj],[ckdm],[ckkw],[bz]) values ('+sqlstr+')';
你执行后,你的commandText已经被重新赋过值了
再用QUERY连接,加入记录APPEND就可以了
是啊 这样的一个操作让你写了一个函数一个过程,ADOCommand1.CommandText:='insert into Table(...) values(...)';
ADOCommand1.Execute;
//加个提示也可以加在BtnClick 就行了,你非要写个几十行..........
Equal;
放到
ADOCommand1.Execute;
上面的最后一行试试看,(猜的):)
特别是 sgzhou12345 因为你提出了另一个比较方便的方案,虽然还我初学delphi,从没有试过你说的方法,便起码你也教我一个比较简便的方法噻,呵呵,我现在就去试试,分全给你了,虽然少点,请别介意.呵呵~~~~~~~~~~同时感谢所有参与这个问题的朋友~~~~~~~~~~~~~感谢你们的无私和热情,谢谢~~~~~~~~~~~~