尝试使用以下代码运行select语句。我正在解析一个SQL表名参数,其值由case语句确定。然后将数据集分配给另一个表单中使用的全局数据源。但是,应用程序返回“FROM子句中的语法错误”对话框。
我已经分配了正确的数据类型,并且在测试过程中,我可以确认参数的值是它所需要的,例如,对于第一种情况,参数的值是“ACCOUNTS”。
我是第一次使用ADO,但是ADOQUERY.SQL.GetText返回的SQL语句带有参数占位符“:ATABLE”,而不是参数值,尽管我目前认为这是正常的。
procedure TfrmDataModule.FindAllRecords(Sender: TObject; recordType: Integer);
var
ADOQuery : TADOQuery;
Param : TParameter;
begin
case recordType of
1 : currentRecordType := 'ACCOUNTS';
2 : currentRecordType := 'CONTACTS';
3 : currentRecordType := 'USERS';
end;
{ SQL Query }
SQLStr := 'SELECT * FROM :ATABLE';
{ Create the query. }
ADOQuery := TADOQuery.Create(Self);
ADOQuery.Connection := ADOConn;
ADOQuery.SQL.Add(SQLStr);
{ Update the parameter that was parsed from the SQL query. }
Param := ADOQuery.Parameters.ParamByName('ATABLE');
Param.DataType := ftString;
Param.Value := currentRecordType;
{ Set the query to Prepared--it will improve performance. }
ADOQuery.Prepared := true;
try
ADOQuery.Active := True;
except
on e: EADOError do
begin
MessageDlg('Error while doing query', mtError,
[mbOK], 0);
Exit;
end;
end;
{ Create the data source. }
DataSrc := TDataSource.Create(Self);
DataSrc.DataSet := ADOQuery;
DataSrc.Enabled := true;
end;
编辑:更多信息。如果注解掉Param行并将SQLStr:ATABLE替换为连接的SQLStr和case变量currentRecordType,查询就可以正常工作。
2条答案
按热度按时间zfciruhq1#
SQL不允许在
FROM
子句中通过参数提供表名。因此,您将不得不使用普通字符串连接来代替,例如:krcsximq2#
由于@DelphiCoder,它似乎不允许将参数作为SQL表名传递。