Delphi ADOQuery未使用已解析的参数值,获取“FROM子句中的语法错误”

izj3ouym  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(184)

尝试使用以下代码运行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,查询就可以正常工作。

zfciruhq

zfciruhq1#

SQL不允许在FROM子句中通过参数提供表名。因此,您将不得不使用普通字符串连接来代替,例如:

procedure TfrmDataModule.FindAllRecords(Sender: TObject; recordType: Integer);
var
  ADOQuery : TADOQuery;
begin
  case recordType of
    1 : currentRecordType := 'ACCOUNTS';
    2 : currentRecordType := 'CONTACTS';
    3 : currentRecordType := 'USERS';
  end;

  { Create the SQL query. }
  ADOQuery := TADOQuery.Create(Self);
  ADOQuery.Connection := ADOConn;
  ADOQuery.SQL.Text := 'SELECT * FROM ' + currentRecordType;

  try
    { Set the query to Prepared--it will improve performance. }
    ADOQuery.Prepared := true;
    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;
krcsximq

krcsximq2#

由于@DelphiCoder,它似乎不允许将参数作为SQL表名传递。

相关问题