#include #include #include #include #include #include #include #include "/home/anikitin/5.6.24/include/mysql.h" #include using namespace std; #define DEBUG #ifdef DEBUG #define debug(format, ...) printf(format, ##__VA_ARGS__) #else #define debug(format, ...) #endif void test(unsigned long type) { const int STRING_SIZE = 1024; const char *const SQL_SELECT = "select a from t"; MYSQL_STMT *stmt; MYSQL *conn_sql = NULL; MYSQL_BIND bind[1]; MYSQL_BIND bind_param[1]; MYSQL_RES *prepare_meta_result = NULL; int param_count; char str_data[STRING_SIZE]; unsigned long str_length; unsigned long length[1]; my_bool is_null[1]; my_bool error[1]; const char * HOST = "127.0.0.1"; const char * USER = "a"; const char * PASSWORD = "1"; const int PORT = 3306; const char * DB = "test"; MYSQL *conn = mysql_init(NULL); if (NULL == mysql_real_connect(conn, HOST, USER, PASSWORD, DB, PORT, NULL, 0)) { printf("Failed to connect to database: Error: %s\n", mysql_error(conn)); return; } /* Prepare a SELECT query to fetch data from it_customer */ stmt = mysql_stmt_init(conn); if (!stmt) { printf("mysql_stmt_init(), out of memory.\n"); return; } if (type == CURSOR_TYPE_READ_ONLY && mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void *)&type)) { printf("Failed to prepare stmt. Failed to set cursor-type property."); printf("%s\n", mysql_stmt_error(stmt)); return; } if (mysql_stmt_prepare(stmt, SQL_SELECT, strlen(SQL_SELECT))) { printf("mysql_stmt_prepare(), SELECT failed\n"); printf("%s\n", mysql_stmt_error(stmt)); return; } debug("mysql_stmt_prepare(), SELECT successful\n"); /* Fetch result set meta information */ prepare_meta_result = mysql_stmt_result_metadata(stmt); if (!prepare_meta_result) { printf("mysql_stmt_result_metadata(), returned no meta information\n"); printf("%s\n", mysql_stmt_error(stmt)); return; } /* Execute the SELECT query */ if (mysql_stmt_execute(stmt)) { printf("mysql_stmt_execute(), failed\n"); printf("%s\n", mysql_stmt_error(stmt)); return; } memset(bind, 0, sizeof(bind)); bind[0].buffer_type= MYSQL_TYPE_DATE; bind[0].buffer_length= sizeof(MYSQL_TIME); bind[0].buffer= (char *)str_data; bind[0].is_null= &is_null[0]; bind[0].length= &length[0]; bind[0].error= &error[0]; if (mysql_stmt_bind_result(stmt, bind)) { printf("mysql_stmt_bind_result() failed\n"); printf("%s\n", mysql_stmt_error(stmt)); return; } /* Now buffer all results to client (optional step) */ if (mysql_stmt_store_result(stmt)) { printf("mysql_stmt_store_result() failed\n"); printf("%s\n", mysql_stmt_error(stmt)); return; } /* Free the prepared result metadata */ if (prepare_meta_result) mysql_free_result(prepare_meta_result); /* Close the statement */ if (mysql_stmt_close(stmt)) { printf("failed while closing the statement\n"); printf("%s\n", mysql_stmt_error(stmt)); return; } mysql_close(conn); printf("test successfully, cursor type=%ld\n", type); } int main(int argc, char ** argv) { // Initialize the MySQL library mysql_library_init(0, NULL, NULL); test(CURSOR_TYPE_READ_ONLY);//successful test(CURSOR_TYPE_NO_CURSOR);//mysql_stmt_store_result failed: The statement (1) has no open cursor // End use of the MySQL library mysql_library_end(); return 0; }