查询分析器里面没有问题,在ADOQuery.sql.add()种为什么就出错呢?
SELECT * FROM AddProduct WHERE (KeHuName = '中国饭店 ') AND (Product = '佛跳墙) AND (AddDate =(SELECT MAX(AddDate) FROM AddProduct where (KeHuName = '中国饭店 ') AND (Product = '佛跳墙)))
在Delphi中我是这样写的:
DM.ADOQuery5.Close;
DM.ADOQuery5.SQL.Clear;
DM.ADOQuery5.SQL.Add( 'SELECT * FROM AddProduct WHERE (KeHuName =:KHN) AND (Product =:PN) AND (AddDate =(SELECT MAX(AddDate) FROM AddProduct where (KeHuName = :KHN) AND (Product = :PN))) ');
DM.ADOQuery5.Parameters.ParamByName( 'KHN ').Value:=ComboBox4.Text;
DM.ADOQuery5.Parameters.ParamByName( 'PN ').Value:=CheckBox4.Caption;
DM.ADOQuery5.Open;
我感觉参数没有错啊。可是运行的时候出现:“不正常地定义参数对象,提供了不一致或不完整的信息”
[解决办法]
DM.ADOQuery5.SQL.Add()参数不能为有参数的sql语句。
写法如下:
DM.ADOQuery5.SQL.Add( 'SELECT * FROM AddProduct WHERE (KeHuName ' + ComboBox4.Text + ') AND (Product = ' + CheckBox4.Caption + ') AND (AddDate =(SELECT MAX(AddDate) FROM AddProduct where (KeHuName = ' + ComboBox4.Text + ') AND (Product = ' + CheckBox4.Caption + '))) ');
[解决办法]
看看这样改行不
DM.ADOQuery5.SQL.Clear;
DM.ADOQuery5.SQL.Add( 'SELECT * FROM AddProduct WHERE (KeHuName =:KHN) AND (Product =:PN) AND (AddDate =(SELECT MAX(AddDate) FROM AddProduct where (KeHuName = :KHN1) AND (Product = :PN1))) ');
DM.ADOQuery5.Parameters.ParamByName( 'KHN ').Value:=ComboBox4.Text;
DM.ADOQuery5.Parameters.ParamByName( 'PN ').Value:=CheckBox4.Caption;
DM.ADOQuery5.Parameters.ParamByName( 'KHN1 ').Value:=ComboBox4.Text;
DM.ADOQuery5.Parameters.ParamByName( 'PN1 ').Value:=CheckBox4.Caption;
DM.ADOQuery5.Open;
[解决办法]
DM.ADOQuery5.Close;
DM.ADOQuery5.SQL.Clear;
DM.ADOQuery5.Text:= 'SELECT * FROM AddProduct WHERE (KeHuName = '+Quotedstr(ComboBox4.Text)+ ') AND (Product = '+Quotedstr(CheckBox4.Caption)+ ') AND (AddDate =(SELECT MAX(AddDate) FROM AddProduct where (KeHuName = '+Quotedstr(ComboBox4.Text)+ ') AND (Product = '+Quotedstr(CheckBox4.Caption)+ '))) ';
DM.ADOQuery5.Open;
[解决办法]
哈哈...楼主想省事呀???
DM.ADOQuery5.Close;
DM.ADOQuery5.SQL.Clear;
DM.ADOQuery5.SQL.Add( 'SELECT * FROM AddProduct WHERE (KeHuName =:KHN) AND (Product =:PN) AND (AddDate =(SELECT MAX(AddDate) FROM AddProduct where (KeHuName = :KHN) AND (Product = :PN))) ');
DM.ADOQuery5.Parameters.ParamByName( 'KHN ').Value:=ComboBox4.Text;
DM.ADOQuery5.Parameters.ParamByName( 'PN ').Value:=CheckBox4.Caption;
DM.ADOQuery5.Open;
你这样写目的想省去一个参数赋值,可是在D中,每一个参数都是有ID号的:Parameters[0..2],即使名字相同也有不同的ID,所以要用三个参数.
[解决办法]
真是佩服死了,为什么大家老喜欢这么写啊,都麻烦的死死得了,我给大家一个函数,以后就如我的实例来用吧!
HBADOConnString =
'Provider=SQLOLEDB.1;Persist Security Info=True;PassWord=%s;User ID=%s;Initial Catalog=%s;Data Source=%s ';
--------------------------------------------
function ConnectHBDataBase(const ServerName,DataBaseName,UserName,UserPassword: string;
ADOConnectionTest: TADOConnection; ShowMsg: Boolean = True): Boolean;
var
fCS: string;
fQuery: TADOQuery;
fUserName, fPassWord: string;
begin
fCS := Format(HBADOConnString, [UserPassword,UserName , DataBaseName, ServerName]);
ADOConnectionTest.Close;
ADOConnectionTest.ConnectionString := fCS;
try
ADOConnectionTest.Open;
except
Result := False;
if ShowMsg then
MessageError( '对不起,数据库服务器地址错误! ');
Exit;
end;
Result := true;
end;
----------------------------------
procedure ADOExecuteSQL(ConnectionObjects: TADOConnection; SQLStr: string);
begin
with TADOQuery.Create(nil) do
try
Connection := ConnectionObjects;
SQL.Text := SQLStr;
ExecSQL;
finally
Free;
end; //try
end;
//调用
接口服务启动后就保持连接,这样更节省资源 ?
HBConnected := ConnectHBDataBase( ZNHBSvrParam.HB_ServerName,ZNHBSvrParam.HB_DataBaseName,
ZNHBSvrParam.HB_UserName,ZNHBSvrParam.HB_UserPassword, HBDBConnection, False);
U_MODE_SQLStr = ' UPDATE A SET A.TIMEMARK = GETDATE() FROM MODE A '+
' WHERE A.TIMEMARK IS NULL AND A.TYPE_NO = ' '%S ' ' AND A.ORDER_NO = %D ';
ADOExecuteSQL(HBDbconn, U_MODE_SQLStr,[fQuery.Fields[0].AsString,fQuery.Fields[1].AsInteger]);