首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何验证数据库是否已设置

如何验证数据库是否已设置
EN

Stack Overflow用户
提问于 2013-07-03 19:27:04
回答 1查看 518关注 0票数 0

我调用了mysql_select_db(),它没有返回错误,但是当我调用mysql_query()时,我得到了以下错误:

没有选择数据库。

我找到了MYSQL结构的一个参数。它是一些char*调用db。它代表什么?mysql_select_db()是否改变了这个参数?

谢谢。

编辑:

我的主要():

代码语言:javascript
运行
复制
#include t-mysql.h
...
  T_MYSQL *db = (T_MYSQL*) malloc(sizeof(T_MYSQL));

  strcpy(db->database_name,mysql_database_name);
  strcpy(db->password,mysql_password);
  strcpy(db->root_password,mysql_root_password);
  strcpy(db->server,mysql_server);
  strcpy(db->table_name,mysql_table_name);
  strcpy(db->user,mysql_user);
  strcpy(db->query_create_db,query_create_db);
  strcpy(db->query_create_table,query_create_table);

  t_mysql_init(db);
  t_mysql_connect(db);
  t_mysql_createdb(db);
  t_mysql_setdb(db);
  t_mysql_createtable(db);
...

T-没药:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <mysql.h>
#include <my_global.h>

#ifndef T_MYSQL_H_
#define T_MYSQL_H_

#define MAX_NAME_LENGTH     128
#define MAX_QUERY_LENGTH    1024

typedef struct {
     MYSQL *con;
     char password[MAX_NAME_LENGTH];
     char root_password[MAX_NAME_LENGTH];
     char user[MAX_NAME_LENGTH];
     char server[MAX_NAME_LENGTH];
     char database_name[MAX_NAME_LENGTH];
     char table_name[MAX_NAME_LENGTH];
     char query_create_table[MAX_QUERY_LENGTH];
     char query_create_db[MAX_QUERY_LENGTH];
     char query_data[MAX_QUERY_LENGTH];

}T_MYSQL;

void finish_with_error(MYSQL *con);
int t_mysql_init(T_MYSQL *mysql);
int t_mysql_connect(T_MYSQL *mysql);
int t_mysql_disconnect(T_MYSQL *mysql);
int t_mysql_createdb(T_MYSQL *mysql);
int t_mysql_createtable(T_MYSQL *mysql);
int t_mysql_setdb(T_MYSQL *mysql);
int t_mysql_insertdata(T_MYSQL *mysql);
int t_mysql_quickinsert(T_MYSQL *mysql);

#endif /* T_MYSQL_H_ */

t-mysql.c:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <mysql.h>
#include <my_global.h>
#include "t-mysql.h"


void finish_with_error(MYSQL *con){
    fprintf(stderr, "%s\n", mysql_error(con));
    mysql_close(con); //close connection to database
}

int t_mysql_init(T_MYSQL *mysql){

    mysql->con = mysql_init(NULL);

    if (mysql->con == NULL){
        finish_with_error(mysql->con);
        return 0;
    }

    return 1;
}


int t_mysql_connect(T_MYSQL *mysql){
    // connect to MySQL
    if (mysql_real_connect(mysql->con, mysql->server, mysql->user, mysql->password,NULL, 0, NULL, 0) == NULL){
            finish_with_error(mysql->con);
            return 0;
    }
    return 1;
}

int t_mysql_disconnect(T_MYSQL *mysql){
    mysql_close(mysql->con);
    if ( mysql->con == NULL){
        finish_with_error(mysql->con);
        return 0;
    }
return 1;
}


int t_mysql_createdb(T_MYSQL *mysql){

    t_mysql_disconnect(mysql); //disconnect normal user
    //connect as root
    t_mysql_init(mysql);
    if (mysql_real_connect(mysql->con, mysql->server, "root", mysql->root_password,NULL, 0, NULL, 0) == NULL){
                finish_with_error(mysql->con);
                return 0;
        }

    // create DB, if it doesn't exist
    if (mysql_select_db(mysql->con, mysql->database_name)){
        if (mysql_query(mysql->con, mysql->query_create_db)){
          finish_with_error(mysql->con);
          return 0;
        }
        else {
        fprintf(stdout,"Database %s created\n",mysql->database_name);
        }
    }else{
        fprintf(stdout,"Database %s exists\n",mysql->database_name);
    }

    //disconnect root user
    t_mysql_disconnect(mysql);
    //connect as normal user
    t_mysql_init(mysql);
    t_mysql_connect(mysql);

    return 1;
}

int t_mysql_setdb(T_MYSQL *mysql){

    if (mysql_select_db(mysql->con, mysql->database_name) == NULL){
        finish_with_error(mysql->con);
        return 0;
    }
    return 1;
}

int t_mysql_createtable(T_MYSQL *mysql){
    //create table:
    if(mysql_query(mysql->con, mysql->query_create_table)){
        finish_with_error(mysql->con);
        return 0;
    }
    return 1;
}

int t_mysql_insertdata(T_MYSQL *mysql){
    if (mysql_query(mysql->con, mysql->query_data)) {
        finish_with_error(mysql->con);
        return 0;
    }
    return 1;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-03 20:54:49

我没有在我的系统上测试您的代码,但我认为,错误在这里:

代码语言:javascript
运行
复制
int t_mysql_setdb(T_MYSQL *mysql){

    if (mysql_select_db(mysql->con, mysql->database_name) == NULL){//<-?
        finish_with_error(mysql->con);
        return 0;
    }
    return 1;
}

您认为,在连接时,当出现错误时,返回的是0。尽管MySQL文档说,情况正好相反:

代码语言:javascript
运行
复制
int mysql_select_db(MYSQL *mysql, const char *db)

Return Values:
Zero for success. Nonzero if an error occurred. 

http://dev.mysql.com/doc/refman/5.5/en/mysql-select-db.html

所以,您正在检查一个错误的值。这意味着,这一声明:

我调用了mysql_select_db(),它没有返回错误

是false,并且在这个函数中有一个错误,您没有捕捉到。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17456536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档