我有选择性程序
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^.name
,LFld^.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