저는 FireDAC를 통해 인터페이스하는 IB 데이터베이스를 실행 중입니다.SQL 변환 오류/select 문에 매개 변수를 삽입하는 방법?
다음 동적 쿼리가 작동합니다
INSERT INTO RELATIONS (C_ID, M_ID, A_ID)
SELECT c.C_ID, 0, a.A_ID
FROM CATEGORIES c, ACTIONS a
WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION
나는 관계에 열 A_INDEX
(정수)를 추가합니다. 이 칼럼에서는 매개 변수를 제공하므로 다음과 같이 처리합니다.
INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX)
SELECT c.C_ID, 0, a.A_ID, :A_INDEX
FROM CATEGORIES c, ACTIONS a
WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION
그러나 이것은 작동하지 않습니다. 어떤 이유로 쿼리를 실행할 때 CATEGORY
param에 대한 변환 오류가 있다고 불평합니다.
이이 쿼리 작업의 전체 코드입니다 :
procedure Test;
var
Query: TFDQuery;
begin
Query := TFDQuery.Create(nil);
try
Query.Connection := DBDataModule.dbMain;
Query.ResourceOptions.ParamCreate := False;
Query.SQL.BeginUpdate;
Query.SQL.Add('INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX)');
Query.SQL.Add('SELECT c.C_ID, 0, a.A_ID,:A_INDEX');
Query.SQL.Add('FROM CATEGORIES c, ACTIONS a');
Query.SQL.Add('WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION');
Query.SQL.EndUpdate;
Query.Params.CreateParam(TFieldType.ftInteger, 'A_INDEX', ptInput);
Query.Params.CreateParam(TFieldType.ftFixedWideChar, 'CATEGORY', ptInput);
Query.Params.CreateParam(TFieldType.ftFixedWideChar, 'ACTION', ptInput);
Query.ParamByName('CATEGORY').Size := 255;
Query.ParamByName('ACTION').Size := 255;
Query.Prepare;
Query.ParamByName('A_INDEX').Value := 0;
Query.ParamByName('CATEGORY').Value := 'Foo';
Query.ParamByName('ACTION').Value := 'Foo';
Query.ExecSQL; // <-- Exception
finally
Query.Free;
end;
end;
난 여전히 SQL에 대해 배우고, 데이터베이스가 날 수있는 이유 & FireDAC 그래서 난 정말 이해가 안 돼요 select 문에 직접 값을 입력하지만 param은 아무 것도하지 않습니다.
그 밖의 방법으로 첫 번째 쿼리를 사용하여 A_INDEX
열에 동적으로 매개 변수를 삽입 할 수 있습니까?
수동으로 매개 변수를 만들거나 "Query.ResourceOptions.ParamCreate : = True;"를 사용합니까? ? – valex
@valex, 내가 자동으로 생성 된 매개 변수를 묻는 질문을 할 때 Vitor는 수동으로 그렇게 제안했지만 변경하지 않았습니다. 내 질문을 전체 코드로 업데이트했습니다. – Peter
지금은 이것을 확인할 수 없지만 'A_INDEX'가 SELECT 목록에 있습니다.예를 들어'INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX)로 바꾸십시오. SELECT c.C_ID, 0, a.A_ID, 0 CATEGORY에서 C, ACTIONS는 어디 c_id = : A_INDEX 및 c. NAME = : CATEGORY AND a.NAME = : ACTION' 그리고 나는 오류없이 잘 돌아갈 것이라고 생각합니다. – valex