hi everybody,
I've got some problems, hope for your helps.
1.
When i try to connect Mysql with 'apr-util DBD' , But get some errors.
After executing 'apr_dbd_pvselect', I got the result 'empty value'.
But i can get correct result with the 'apr_dbd_select' method.
in my code:
entry = apr_dbd_get_entry(driver, row, n);
but I got nothing.
How to fix the 'empty value' problem?
2.
I try to query "select * from ..." but got a "Exec of prepared
statement failed!"
But "select userName from ..." makes the right results.
Is there anything wrong?
Thanks for your helps and replies!
My code is as follows:
Environment:
apr-util : 1.3.9
ubuntu : 9.04
mysql : 5.0.75
TABLE Structure:
CREATE TABLE `testTable` {
`id` int(11) NOT NULL,
`userName` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
}ENGINE=MyISAM DEFAULT CHARSET=latin1;
Sourceļ¼
#include "apu.h"
#include "apr_pools.h"
#include "apr_dbd.h"
#include <stdio.h>
int main(int argc, char **argv) {
const char *name = "mysql";
const char *params =
"host=127.0.0.1,user=root,pass=123456,dbname=testDB,port=3306";
apr_pool_t *pool = NULL;
apr_dbd_t *sql = NULL;
const apr_dbd_driver_t *driver = NULL;
int rv;
const char *query = "SELECT userName FROM testTable where
id=%d";/*this query exec info:ok!!!*/
//const char *query = "SELECT * FROM testTable where id=%d";/*this
query exec info:"Exec of prepared statement failed!"???*/
const char *label = "getUserName";
apr_dbd_prepared_t *statement = NULL;
apr_dbd_results_t *res = NULL;
apr_dbd_row_t *row = NULL;
const char *entry = NULL;
int i, n;
apr_initialize();
apr_pool_create(&pool, NULL);
apr_dbd_init(pool);
rv = apr_dbd_get_driver(pool, name, &driver);
switch (rv) {
case APR_SUCCESS:
printf("Loaded %s driver OK.\n", name);
break;
case APR_EDSOOPEN:
printf("Failed to load driver file apr_dbd_%s.so\n", name);
goto finish;
case APR_ESYMNOTFOUND:
printf("Failed to load driver apr_dbd_%s_driver.\n", name);
goto finish;
case APR_ENOTIMPL:
printf("No driver available for %s.\n", name);
goto finish;
default: /* it's a bug if none of the above happen */
printf("Internal error loading %s.\n", name);
goto finish;
}
rv = apr_dbd_open(driver, pool, params, &sql);
switch (rv) {
case APR_SUCCESS:
printf("Opened %s[%s] OK\n", name, params);
break;
case APR_EGENERAL:
printf("Failed to open %s[%s]\n", name, params);
goto finish;
default: /* it's a bug if none of the above happen */
printf("Internal error opening %s[%s]\n", name, params);
goto finish;
}
rv = apr_dbd_prepare(driver, pool, sql, query, label, &statement);
if (rv) {
printf("Prepare statement failed!\n%s\n",
apr_dbd_error(driver, sql, rv));
return rv;
}
int user_id = 1;
rv
= apr_dbd_pvselect(driver, pool, sql, &res, statement, 0,
&user_id,
NULL);
if (rv) {
printf("Exec of prepared statement failed!\n%s\n", apr_dbd_error(
driver, sql, rv));
return rv;
}
i = 0;
for (rv = apr_dbd_get_row(driver, pool, res, &row, -1); rv == 0; rv
= apr_dbd_get_row(driver, pool, res, &row, -1)) {
printf("ROW %d: ", ++i);
for (n = 0; n < apr_dbd_num_cols(driver, res); ++n) {
entry = apr_dbd_get_entry(driver, row, n);
if (entry == NULL) {
printf("(null) ");
} else {
printf("%s ", entry);/*printf Nothing???*/
}
}
fputs("\n", stdout);
}
finish:
printf("finish");
apr_pool_destroy(pool);
apr_terminate();
return 0;
}