C++ 连接MYSQL
首先是配置环境在配置环境之前先看几个类型:
在Viual Studio 2015的项目属性中添加包含目录和库目录如图所示:(如果使用win32 ,则需要下载对应的32bit的MYSQL的C++动态链接库和包含文件)
配置库文件:(32位的需要将平台设置为win32)
如上图在链接器的附加依赖项中添加libmysql.lib,同时要将与libmysql.lib的同一文件下的libmysql.dll拷贝到项目可执行文件所在的目录中。
配置好环境后就是连接数据库,连接操作数据库的步骤如代码所示:
#include #include
wchar_t* Utf8_2_Unicode(char* row_i)
{
int len = MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), NULL, 0);
wchar_t *wszStr = new wchar_t[len + 1];
MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), wszStr, len);
wszStr[len] = '\0';
return wszStr;
}
int main(int argc,char* argv[])
{
const char* host = "127.0.0.1";
const char* user = "root";
const char* pass = "1234";
const char* db = "sct";
MYSQL sock;
int res;
mysql_init(&sock);
MYSQL_RES *result;
if (mysql_real_connect(&sock,host,user,pass,db,3306,NULL,CLIENT_FOUND_ROWS))
{
printf("connect success!\n");
mysql_query(&sock,"set names gbk");
res = mysql_query(&sock,"select * from student");
if (res )
{
printf("error");
}
else
{
result = mysql_store_result(&sock);
int column = mysql_num_fields(result);
int col = mysql_num_rows(result);
for(int i=0; i < col ; i++)
{
MYSQL_ROW row = mysql_fetch_row(result);
for(int j=0;j < column;j++)
{
std::cout << row[j] << std::endl;
}
}
printf("OK");
}
mysql_close(&sock);
}
return 0;
}
共分为一下几个步骤:
1. 使用MYSQL *mysql_init(MYSQL *mysql)初始化MYSQL 连接句柄mysql_con
返回值:成功MYSQL连接句柄,失败返回NULL
参数说明:
mysql : MYSQL类型的句柄
PS: 必须与void mysql_close(MYSQL* sock) 成对使用
2. 使用MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);
返回值:
如果连接成功返回MYSQL* 句柄且与第一个参数相同,否则返回NULL
参数说明:
mysql : MYSQL类型的指针,表示mysql的句柄
host : 数据库服务器主机
user :用户名
passwd : 密码
port : 端口号一般为3306
unix_socket : 使用unix连接方式,当为空是表示不使用socket或管道机制
clientflag : 值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:
3. 使用int mysql_query(MYSQL *mysql, const char*stmt_str) 执行SQL语句,并将结果保存到mysql句柄中
返回值:执行成功返回0,执行失败返回非0值
参数说明:
mysql : MYSQL* 类型的数据库连接句柄
stmt_str : 结构化查询语句(SQL语句)
PS: 不用用于查询语句中含有二进制的数据,如果包含二进制的数据可以使用mysql_real_query()进行代替
异常类型:
4. 使用MYSQL_RES * mysql_store_result(MYSQL *mysql);将mysql中的结果取出,并保存到MYSQL_RES* 结构体中
返回值 : MYSQL_RES类型的指针,表明执行SQL语句后的结果
参数:
mysql : MYSQL* 类型的数据库连接句柄
异常类型:
5. 使用unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);或者unsigned int STDCALL mysql_field_count(MYSQL *mysql);
读取操作结果后的字段(域)的个数
返回值:字段的个数
参数为上一步获取的MYSQL_RES或者执行mysql_query之后的数据库连接句柄mysql
6. 使用my_ulonglong mysql_num_rows(MYSQL_RES *res);获取结果集中的记录条数
参数说明:
res : 通过mysql_store_result()获取的结果集
7. 使用 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);读取结果集中的一条记录,同时结果集的当前记录指针会后移一条
参数说明:
res : 通过mysql_store_result()获取的结果集
8. 最后就是对MYSQL_ROW的操作,然后使用void mysql_close(MYSQL *mysql);将mysql释放。
以下是上面用到的数据结构:
MYSQL句柄:
typedef struct st_mysql
{
NET net; /* Communication parameters */
unsigned char *connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
char *info, *db;
struct charset_info_st *charset;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Not used */
unsigned long thread_id; /* Id for connection in server */
unsigned long packet_length;
unsigned int port;
unsigned long client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned int server_language;
unsigned int warning_count;
struct st_mysql_options options;
enum mysql_status status;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
/* session-wide random string */
char scramble[SCRAMBLE_LENGTH+1];
my_bool unused1;
void *unused2, *unused3, *unused4, *unused5;
LIST *stmts; /* list of all statements */
const struct st_mysql_methods *methods;
void *thd;
/*Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flagfrom mysql_stmt_close if close had to cancel result set of this object.*/
my_bool *unbuffered_fetch_owner;
/* needed for embedded server - no net buffer to store the 'info' */
char *info_buffer;
void *extension;
} MYSQL;
MYSQL操作结果:
typedef struct st_mysql_res {
my_ulonglong row_count;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
const struct st_mysql_methods *methods;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
MEM_ROOT field_alloc;
unsigned int field_count, current_field;
my_bool eof; /* Used by mysql_fetch_row */
/* mysql_stmt_close() had to cancel this result */
my_bool unbuffered_fetch_cancelled;
void *extension;
} MYSQL_RES;
所有记录的信息,使用链表保存
typedef char **MYSQL_ROW; /* return data as array of strings */
typedef struct st_mysql_rows {
struct st_mysql_rows *next; /* list of rows */
MYSQL_ROW data;
unsigned long length;
} MYSQL_ROWS;