1

我正在开发 Typhon IDE(v.5.1 和 FPC v.2.7.1)并且正在创建用户登录功能,使用 PostgreSQL 9.3 作为数据库和 Zeos 7.2 作为数据连接器。

我有以下代码:

   // ZQ: TZQuery;    
   zq := ExecSQL('SELECT '+
          'role_name, '+
          'role_enabled, '+
          'uid, '+
          'role_uid, '+
          'user_name, '+
          'enabled, '+
          'full_name, '+
          'user_email '+
          'FROM vw_usr_users '+
          'where user_name = '+QuotedStr(AUserName)+' and enabled = ''Y'' and user_password = md5('+QuotedStr(APassword)+');');
      ShowDebugSQL(zq.SQL);
      ShowMessage(IntToStr(zq.FieldCount));
      ShowMessage(zq.FieldByName('role_uid').AsString);
      if not zq.IsEmpty then
      begin
        if zq.FieldByName('role_uid').AsString = '' then
        begin
          MessageDlg('Error','User have no role...',mtError, [mbOK], 0);
        end
        else
        begin
            Self.FId:=zq.FieldByName('uid').AsString;
            Self.FUserName:=AUserName;
            Self.FPassword:=APassword;
            Self.fEnabled:= zq.FieldByName('enabled').AsString = 'Y';
            Self.fRoleID:=zq.FieldByName('role_uid').AsString;
            Self.FRoleName:=zq.FieldByName('role_name').AsString;
            Self.FFullName:= zq.FieldByName('full_name').AsString;
            Self.FEmail:= zq.FieldByName('user_email').AsString;
            Self.Log(LOG_ACTIVITY_LOGIN);
            Result := True;
        end;
     end
  //......
  • ExecSQL 是一个辅助函数,创建 TZQuery 实例,分配连接和 SQL,然后打开它。

当我运行上面的代码时,我收到错误消息,指出未找到字段“role_uid”。

未找到字段“role_uid”

ShowMessage(IntToStr(zq.FieldCount));

仅显示 6 个字段,但我制作的助手 ShowDebugSQL 用于在备忘录中显示 SQL

ShowDebugSQL(zq.SQL);

给了我预期的 SQL

完整的 SQL

和我在 pgAdmin 上测试的正确结果: pgAdmin 显示 8 个字段

我已经使用循环测试了结果字段列表,并且只有 6 个字段。请帮我指出我的代码有什么问题。非常感谢。

4

1 回答 1

0

Zeos 无法识别 UUID 类型的 PostgreSQL 字段。必须将 UUID 字段类型转换为字符变化 (36)以使它们在 Zeos 数据集上可用。

zq := Query('SELECT '+
      'role_name, '+
      'role_enabled, '+
      //---------------------------
      'uid::varchar(36) as uid, '+
      'role_uid::varchar(36) as role_uid, '+
      //---------------------------
      'user_name, '+
      'enabled, '+
      'full_name, '+
      'user_email '+
      'FROM vw_usr_users '+
      'where user_name = '+QuotedStr(AUserName)+' and enabled = ''Y'' and user_password = md5('+QuotedStr(APassword)+');', False);
于 2015-05-16T15:29:19.323 回答