【问题标题】:Determine a parameters data type in a parameterized query using Zeoslib使用 Zeoslib 在参数化查询中确定参数数据类型
【发布时间】:2015-10-10 10:48:06
【问题描述】:

是否可以使用 Zeoslib 和 Firebird 在参数化查询中确定参数数据类型?

我正在从 FibPlus 迁移到 Zeoslib。

带有类似“从注册成员中选择姓名、姓氏、年龄> :since and nationality = :country”这样的语句

使用 FibPlus 我这样做:

  for i := 0 to Q1.Params.Count - 1 do
  begin

    t := Q1.Params[i].ServerSQLType;

    case t of
      SQL_TYPE_DATE, SQL_TYPE_DATE + 1:
        begin
          with TsDateEdit.Create(self) do
          begin
            Left := lblleft + MaxWidth + 10;
            Top := lbltop + (25 * i) - (height - LabelHeight);
            Parent := f;
            Tag := i + 1;
            TabOrder := i;
          end;
        end;
      sql_short, sql_long, sql_int64, sql_short + 1, sql_long + 1, sql_int64 + 1:
        begin
          with TsSpinEdit.Create(self) do
          begin
            Left := lblleft + MaxWidth + 10;
            Top := lbltop + (25 * i) - (height - LabelHeight);
            Parent := f;
            Tag := i + 1;
            TabOrder := i;
          end;
        end;
....

使用 Zeoslib 我已经尝试过:

  for i := 0 to Q1.Params.Count - 1 do
  begin

    if Q1.Params[i].DataType = ftDate then
        begin
          with TsDateEdit.Create(self) do
          begin
            Left := lblleft + MaxWidth + 10;
            Top := lbltop + (25 * i) - (height - LabelHeight);
            Parent := f;
            Tag := i + 1;
            TabOrder := i;
          end;
        end;

    if Q1.Params[i].DataType in [ftInteger, ftShortInt, ftLargeInt, ftLongWord] then
        begin
          with TsSpinEdit.Create(self) do
          begin
            Left := lblleft + MaxWidth + 10;
            Top := lbltop + (25 * i) - (height - LabelHeight);
            Parent := f;
            Tag := i + 1;
            TabOrder := i;
          end;
        end;
....

但 Q1.Params[i].DataType 总是 ftUnkown。

【问题讨论】:

  • 这是为了允许用户选择一个查询并呈现一个适当的输入表单,以便他们输入参数所需的值。

标签: delphi firebird zeos fibplus


【解决方案1】:

你不能用婴儿车来做这件事,因为它们现在还没有设置好。我建议你使用 TZSQLMetadata;

  ZSQLMetadata1 := TZSQLMetadata.Create(Self);
  try
    ZSQLMetadata1.Connection := ZConnection1; //Your connection to db
    ZSQLMetadata1.MetadataType := mdColumns; //What kind of meta data get you want column types so we get columns metadata
    ZSQLMetadata1.TableName := 'MYTABLE'; //from which table metadata to get
    ZSQLMetadata1.Open;

    //After open ZSQLMetadata1 rows contains information about table columns
    while not ZSQLMetadata1.Eof do
    begin
      if ZSQLMetadata1.FieldByName('TYPE_NAME').AsString = 'char' then
      begin
        //Do something
      end;

      { if you do not like working with strings
      if ZSQLMetadata1.FieldByName('DATA_NAME').AsInteger = 9 then
      begin
        //Do something
      end;
      }   
      ZSQLMetadata1.Next;
    end;
  finally
    ZSQLMetadata1.Free;
  end;

ZSQLMetadata1 像数据集一样工作,您可以将其分配给数据源广告查看 dbgrid 中的所有列和值

/编辑/ 列名和字段值是数据库细节,我的示例是在 MySQL 数据库上

【讨论】:

  • 嗨,Imants。我同意您可以使用 TZSQLMetadata 组件获取表的元数据。我经常使用它。问题是如何从sql语句中确定需要的参数数据类型。
  • 可以做到,但需要解析所涉及的表的语句、与参数进行比较的字段等......无论如何,TZQuery 必须在内部完成所有这些工作。我只是认为必须有一种更直接的方法。
  • 如果参数与字段命名相同,那么它们的类型必须匹配(我通常将它们命名相同)。 ZQury 不会确定它发送的参数类型与用户设置的相同,然后检查数据库错误。数据库检查参数。
猜你喜欢
  • 1970-01-01
  • 2016-09-13
  • 2020-05-16
  • 2014-12-10
  • 2023-03-26
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2011-12-27
相关资源
最近更新 更多