Есть вот функция такая: (D2007, FB2, dbExpress):
PHP код:
function TSQLDatabaseThread.SelectSQLA(const Q: String; const ParamNames,
ParamValues: array of Variant): TSQLDataSet;
var Command: String;
PNI, PNC: Integer;
function ParamType(const Param: Variant): Byte;
var basicType: TVarType;
begin
basicType := VarType(Param) and VarTypeMask;
case basicType of
varEmpty : Result := VT_EMPTY;
varNull : Result := VT_NULL;
varSmallInt : Result := VT_SMALLINT;
varInteger : Result := VT_INTEGER;
varSingle : Result := VT_SINGLE;
varDouble : Result := VT_DOUBLE;
varCurrency : Result := VT_CURRENCY;
varDate : Result := VT_DATE;
varBoolean : Result := VT_BOOL;
varVariant : Result := VT_VARIANT;
varUnknown : Result := VT_UNKNOWN;
varByte : Result := VT_BYTE;
varWord : Result := VT_WORD;
varLongWord : Result := VT_WORD;
varInt64 : Result := VT_INT64;
varStrArg : Result := VT_STRING;
varString : Result := VT_STRING;
varAny : Result := VT_ANY;
varTypeMask : Result := VT_TYPEMASK;
else Result := VT_UNKNOWN;
end;
end;
begin
// выполнение запроса (определение автоматическое)
Result := TSQLDataSet.Create(nil);
if Connection.Connected=False then begin
Connection.Connected := True;
end;
Result.SQLConnection := Connection;
Result.ParamCheck := (Length(ParamNames)<>0);
//try
Result.CommandText := Q;
Command := Parse(Q, #32, 1);
// Result.Params := TParams.Create(Result);
Result.Params.Clear;
Result.Close;
if Length(ParamNames)<>0 then begin
// перечисление параметров
PNC := Length(ParamNames)-1; // количество параметров
for PNI := 0 to PNC do begin
case ParamType(ParamValues[PNI]) of
VT_UNKNOWN,
VT_NULL : Result.Params.CreateParam(ftUnknown, ParamNames[PNI], ptInputOutput);
VT_SMALLINT : Result.Params.CreateParam(ftSmallInt, ParamNames[PNI], ptInputOutput);
VT_INTEGER,
VT_SINGLE : Result.Params.CreateParam(ftInteger, ParamNames[PNI], ptInputOutput);
VT_DOUBLE : Result.Params.CreateParam(ftFloat, ParamNames[PNI], ptInputOutput);
VT_CURRENCY : Result.Params.CreateParam(ftCurrency, ParamNames[PNI], ptInputOutput);
VT_DATE : Result.Params.CreateParam(ftDate, ParamNames[PNI], ptInputOutput);
VT_BOOL : Result.Params.CreateParam(ftBoolean, ParamNames[PNI], ptInputOutput);
VT_VARIANT : Result.Params.CreateParam(ftVariant, ParamNames[PNI], ptInputOutput);
VT_BYTE : Result.Params.CreateParam(ftFloat, ParamNames[PNI], ptInputOutput);
VT_WORD,
VT_LWORD : Result.Params.CreateParam(ftWord, ParamNames[PNI], ptInputOutput);
VT_INT64 : Result.Params.CreateParam(ftInteger, ParamNames[PNI], ptInputOutput);
VT_STRARG,
VT_STRING : Result.Params.CreateParam(ftString, ParamNames[PNI], ptInputOutput);
VT_ANY : Result.Params.CreateParam(ftVarBytes, ParamNames[PNI], ptInputOutput);
VT_TYPEMASK : Result.Params.CreateParam(ftUnknown, ParamNames[PNI], ptInputOutput);
else
Result.Params.CreateParam(ftVariant, ParamNames[PNI],
ptUnknown);
end;
Result.Params.ParamByName(ParamNames[PNI]).AsString :=
String(ParamValues[PNI]);
end;
end;
if (Command='SELECT') then begin
Result.Open
end else begin
Result.ExecSQL();
FinalizeSQL(Result);
end;
{
except
Result.Close;
Result.Free;
Exit(nil);
end;
}
end;
Почему-то если параметрами подсунуть скажем ['uid', 3] то выполняется нормально и возвращает датасет. А вот если подсунуть скажем ['uname', 'какая_то_строка'], выдает "Incorrect values within SQLDA structure". ParamCheck := False не помогло.
Где могут быть грабли?