MySQL编写的语句结果元数据

时间:2016-11-19 12:29:15

标签: mysql select stored-procedures prepared-statement metadata

我有选择性程序

CREATE PROCEDURE sp_d_test()
  NOT DETERMINISTIC
  CONTAINS SQL
  SQL SECURITY DEFINER
  COMMENT ''
BEGIN
  SELECT * FROM my_table;
END;

我希望使用预准备语句获取元数据结果(字段名称)

procedure TForm1.btnLowAPIClick(Sender: TObject);
var
  LConn: Pointer;
  LSQL: AnsiString;
  LStmt: PMYSQL_STMT;
  LCnt: Integer;
  LFld: PMYSQL_FIELD;
  LRes: PMYSQL_RES;
begin
  LConn := MySQLInit;
  mysql_real_connect(LConn, 'localhost', 'root', '', 'test', 0, nil, CLIENT_MULTI_RESULTS);
  MySQLQuery(LConn, 'SET character_set_results=ucs2');
  LSQL := 'CALL sp_d_test()';
  LStmt := mysql_stmt_init(LConn);
  if mysql_stmt_prepare(LStmt, PAnsiChar(LSQL), Length(LSQL)) <> 0 then
    MySQLStmtError(LStmt);
  if mysql_stmt_execute(LStmt) <> 0 then
    MySQLStmtError(LStmt);
  LCnt := mysql_stmt_field_count(LStmt);  // Returns corrected number
  LRes := mysql_stmt_result_metadata(LStmt);
  LFld := mysql_fetch_field(LRes);
  while LFld <> nil do begin
    LStr := UCS2BytesToUTF16(PByte(LFld^.name), LFld^.name_length);
    LFld := mysql_fetch_field(LRes);
  end;
end;

字段LFld^.nameLFld^.name_length包含垃圾。字段LFld^.type包含更正后的类型

如果我这样做

MySQLQuery(LConn, 'SET character_set_results=utf8');

然后字段LFld^.name包含更正的值,但LFld^.name_length仍包含垃圾。

简单选择

LSQL := 'SELECT * FROM my_table';

正确填充结构,适用于UCS2和UTF8。有一个但是。文档说

  

char * name

     

字段的名称,作为以null结尾字符串。如果字段被赋予带有AS子句的别名,则name的值是别名。对于过程参数,参数名称。

对于UCS2,字段name NOT 以null结尾,但name_length包含以字节为单位的实际大小

服务器版本5.1.41

0 个答案:

没有答案