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]

Reply via email to