Hi, I have a problem with the statement-api. I try to select a value of type decimal(12,2) from a mysql-database. To get information about this column, I use mysql_stmt_result_metadata. The problem here is, that the type of the column is 0. When I try to use it in a MYSQL_BIND-structure and call mysql_stmt_bind_result, I get error 2036: "Using unsupported buffer type: 0". For other column-types I get reasonable values.
I attach a minimal program, which reproduces the error. My configuration: Mysql-version 4.1.13 on SuSE-Linux 10.0, x86-64. Table-structure: mysql> show columns from PRODUCTS; +----------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+---------------+------+-----+---------+----------------+ | PROD_ID | int(11) | | PRI | NULL | auto_increment | | CATEGORY | tinyint(4) | | MUL | 0 | | | TITLE | varchar(50) | | MUL | | | | ACTOR | varchar(50) | | MUL | | | | PRICE | decimal(12,2) | | | 0.00 | | | SPECIAL | tinyint(4) | YES | MUL | NULL | | | COMMON_PROD_ID | int(11) | | | 0 | | +----------------+---------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) Tommi
#include <stdio.h> #include <mysql.h> #include <stdlib.h> #include <string.h> #define HOST "localhost" #define USER "web" #define PASSWORD "web" #define DATABASE "DS2" #define PORT 3306 /* PRICE is of type decimal(12,2) */ #define SELECT "SELECT PRICE FROM PRODUCTS" void checkError(MYSQL* mysql, const char* fn, int ret) { if (ret != 0) { fprintf(stderr, "%s %d: %s \n", fn, mysql_errno(mysql), mysql_error(mysql)); exit(1); } } void checkErrorStmt(MYSQL_STMT* stmt, const char* fn, int ret) { if (ret != 0) { fprintf(stderr, "%s %d: %s \n", fn, (int)mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); exit(1); } } int main() { MYSQL mysql; MYSQL_STMT* stmt; MYSQL_BIND result[1]; MYSQL_RES* metadata; MYSQL_FIELD* fields; char price[64]; unsigned long price_length; int ret; my_bool bool_ret; mysql_init(&mysql); printf("mysql_real_connect\n"); ret = (int)mysql_real_connect(&mysql, HOST, USER, PASSWORD, DATABASE, PORT, NULL, 0); checkError(&mysql, "mysql_real_connect", !ret); printf("mysql_stmt_init\n"); stmt = mysql_stmt_init(&mysql); if (stmt == 0) { fprintf(stderr, "out of memory"); exit(1); } printf("mysql_stmt_prepare\n"); ret = mysql_stmt_prepare(stmt, SELECT, strlen(SELECT)); checkErrorStmt(stmt, "mysql_stmt_prepare", ret); printf("mysql_stmt_execute\n"); ret = mysql_stmt_execute(stmt); checkErrorStmt(stmt, "mysql_stmt_execute", ret); printf("mysql_stmt_result_metadata\n"); metadata = mysql_stmt_result_metadata(stmt); if (metadata == 0) { fprintf(stderr, "no metadata available"); exit(1); } printf("mysql_fetch_fields\n"); fields = mysql_fetch_fields(metadata); printf("field-type=%d\n", (int)fields[0].type); printf("initialize result\n"); memset(result, 0, sizeof(MYSQL_BIND)); result[0].buffer_type = fields[0].type; result[0].buffer = price; result[0].buffer_length = sizeof(price); result[0].length = &price_length; printf("mysql_stmt_bind_result\n"); bool_ret = mysql_stmt_bind_result(stmt, result); checkErrorStmt(stmt, "mysql_stmt_bind_result", bool_ret); }
mmm: mmm.o CC=gcc CFLAGS=`mysql_config --cflags` LDFLAGS=`mysql_config --libs`
-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]