给TADOQUERY .parameters赋值时指定数据类型不起作用
procedure AddPara;
begin
with ADOQry.Parameters do
begin
tmpPos := FNameList.IndexOfObject(TObject(STOCK));
if tmpPos > -1 then
with AddParameter do
begin
Name := 'GPMC_O ' + FParameterID;
Direction := pdInput;
DataType := ftWideString;
Value := FNameList[tmpPos];
end;
end;
with AddParameter do
begin
Name := 'GPMC ' + FParameterID;
Direction := pdInput;
DataType := ftWideString;
Value := EdtStockName.Text;
end;
with AddParameter do
begin
Name := 'QDFS_S ' + FParameterID;
Direction := pdInput;
DataType := ftinteger;
Value := Integer(CBGetMode_Stock.Items.Objects[CBGetMode_Stock.ItemIndex]);
end;
with AddParameter do
begin
Name := 'RZSJ_S ' + FParameterID;
Direction := pdInput;
DataType := ftDateTime;
Value := DTPStock.Date;
end;
with AddParameter do
begin
Name := 'GQSL ' + FParameterID;
Direction := pdInput;
DataType := ftInteger;
Value := SENum.Value;
end;
with AddParameter do
begin
Name := 'SFSS ' + FParameterID;
Direction := pdInput;
DataType := ftBoolean;
Value := RGMarket.ItemIndex = 1;
end;
with AddParameter do
begin
Name := 'ZGB ' + FParameterID;
Direction := pdInput;
DataType := ftInteger;
Value := NECapital.Value * MoneyUnit;
end;
if Trim(EdtTrade.Text) = ' ' then
EdtTrade.Text := ' ';
with AddParameter do
begin
Name := 'SSHY ' + FParameterID;
Direction := pdInput;
DataType := ftWideString;
Value := EdtTrade.Text;
end;
with AddParameter do
begin
Name := 'JYZK ' + FParameterID;
Direction := pdInput;
DataType := ftInteger;
Value := Integer(CBFare.Items.Objects[CBFare.ItemIndex]);
end;
with AddParameter do
begin
Name := 'PGJ_S ' + FParameterID;
Direction := pdInput;
DataType:= ftFloat;
Value := NEEvaluate_Stock.Value * MoneyUnit;
end;
with AddParameter do
begin
Name := 'SFGH_S ' + FParameterID;
Direction := pdInput;
DataType := ftBoolean;
Value := RGTransfer_Stock.ItemIndex = 1;
end;
end;
调用 这个过程添加参数,后来又添加了SQL语句到ADOQUERY.SQL,然后再调用这个过程添加参数
但执行时发现,除了最后一次添加的参数,前面添加的参数数据类型全部变成了ftWideString,就好像被什么覆盖了一样,但参数对象还在,值也对,就是DATATYPE不对了。这是为什么?
[解决办法]
代码不对吧
with ADOQry.Parameters do
begin
tmpPos := FNameList.IndexOfObject(TObject(STOCK));
if tmpPos > -1 then
with AddParameter do
begin
Name := 'GPMC_O ' + FParameterID;
Direction := pdInput;
DataType := ftWideString;
Value := FNameList[tmpPos];
end;
end; ------------------------------这个地方对应的是with ADOQry.Parameters do
[解决办法]
晕,ado控件让你用成这样,简直是天才呀。你的代码没有太仔细看,不要说我不尊重你。但是大概知道你的意思了。给你一段代码你看看是不是符合你的要求。
procedure TcallData.updateInf(sqlText: string; paramvalues: TStringList; out errorHint: WideString);
var
tmpquery: TQuery;
i: integer;
begin
try
tmpquery := TQuery.Create(nil);
with tmpquery do
begin
DatabaseName := Fdm.DatabaseName;
Close;
sql.Clear;
sql.Add(sqlText);
if (Assigned(paramvalues)) and (paramvalues.Count > 0) then
begin
for i := 0 to paramvalues.Count - 1 do
begin
Params[i].Value := paramvalues.Strings[i];
end;
end;
try
ExecSQL;
except
end;
end;
finally
tmpquery.Free;
end;
end;
[解决办法]
补充一下,上边的代码是对应tquery的,tadoquery和他差不多。自己修改一下就可以了。
[解决办法]
tquery和tadoquery是不需非要指定数据类型的,只要使用上边的办法就可以自己寻找数据库表中对应的数据类型并进行自动转换。除非你录入的数据类型转换失败,否则可以自己对应。