我努力的全部意义是想给爸妈买东西的时候,像他们给我买时一样干脆。 ----夏不夏说
来源:知乎 https://www.zhihu.com/question/34472193/answer/193505071
不多说直接看代码
int
main()
{
MYSQL
*
conn;
//数据库链接句柄
MYSQL_RES
*
res;
//返回的查询结果,相当于表
MYSQL_ROW row;
//一行数据显示
char
server[
20
]
=
"localhost"
;
char
user[
20
]
=
"root"
;
//用户
char
passwd [
20
]
=
"123"
;
//密码
char
database[
20
]
=
"library"
;
//数据库名
conn
=
mysql_init(
NULL
);
//数据库句柄的初始化
if
(
NULL
==
mysql_real_connect(conn, server, user, passwd, database,
0
,
NULL
,
0
))
//连接数据库
{
cout
<<
"connect failed\n"
;
exit(
1
);
}
mysql_set_character_set(conn,
"utf8"
);
//设置字符集
if
(mysql_query(conn,
"select * from cour"
)) //我数据库中的一张表
{
cout
<<
"send filed"
<<
endl;
exit(
1
);
}
res
=
mysql_use_result(conn);
//获取字符集
while
((row
=
mysql_fetch_row(res))
!=
NULL
)
{
printf(
"%s\t%s\t%s\t%s\n"
, row[
0
], row[
1
], row[
2
], row[
3
]);
}
mysql_free_result(res);
//释放结果集
mysql_close(conn);
//关闭数据库
return
0
;
}
以上就是最简单的C++结合MySQL的代码,为了使用方便,可以封装成一个简单的类
class
Database
{
public:
Database()
{
}
static
Database
&
getInstance();
void
init(); //初始化程序
void
sendQueryCommand(
const
char
*
command);//发送查询指令
void
sendExeCommand(
const
char
*
command);//发送执行指令
void
closeDatabase();//关闭数据库
private:
MYSQL
*
conn;
//数据库链接句柄
MYSQL_RES
*
res;
//返回的查询结果,相当于表
MYSQL_ROW row;
//一行数据显示
MYSQL_FIELD
*
field;
};
Database
&
Database::getInstance()
{
static
Database data;
return
data;
}
void
Database::init()
//初始化程序
{
char
server[
20
]
=
"localhost"
;
char
user[
20
]
=
"root"
;
//用户
char
passwd [
20
]
=
"123"
;
//密码
char
database[
20
]
=
"library"
;
//数据库名
conn
=
mysql_init(
NULL
);
//数据库句柄的初始化
if
(
NULL
==
mysql_real_connect(conn, server, user, passwd, database,
0
,
NULL
,
0
))
//连接数据库
{
cout
<<
"connect failed\n"
;
mysql_close(conn);
//关闭数据库
exit(
1
);
}
mysql_set_character_set(conn,
"utf8"
);
//设置字符集
}
void
Database::sendExeCommand(
const
char
*
command)
//发送执行指令
{
if
(mysql_query(conn, command))
{
cout
<<
"send failed"
<<
endl;
mysql_close(conn);
exit(
-
1
);
}
}
void
Database::sendQueryCommand(
const
char
*
command)
//发送查询指令
{
int
iColumn
=
0
;
int
iRow
=
0
;
if
(mysql_query(conn, command))
{
cout
<<
"send failed"
<<
endl;
mysql_close(conn);
//关闭数据库
exit(
-
1
);
}
res
=
mysql_store_result(conn);
iColumn
=
mysql_num_fields(res);
iRow
=
mysql_num_rows(res);
cout
<<
"\t查询到\33[31m "
<<
iRow
<<
" \33[0m行"
<<
endl;
for
(
int
i
=
0
; i
<
iColumn; i
++
)
{
field
=
mysql_fetch_field(res);
cout
<<
"\t"
<<
field->name;
}
cout
<<
endl;
for
(
int
i
=
0
; i
<
iRow; i
++
)
{
row
=
mysql_fetch_row(res);
for
(
int
j
=
0
; j
<
iColumn; j
++
)
{
cout
<<
"\t"
<<
row[j];
}
cout
<<
endl;
}
mysql_free_result(res);
//释放结果集
}
void
Database::closeDatabase()
{
mysql_close(conn);
//关闭数据库
}
这样进行简单的封装后,初始化函数和关闭数据库函数只需要执行一次,可以多次发送指令。只需向
sendExeCommand(
)和sendQueryCommand()两个函数传入字符串即可。
例:
Database::getInstance().sendQueryCommand(
"select * from book;"
);
有时候我们发送的指令需要根据输入而改变,这时候需要进行字符串拼接,这里提供两个简单的方法
。
1:使用函数c_str();
string buffer
=
"insert into book(名称, 作者, 出版社, 价格) values('"
+
name
+
"', '"
+
author
+
"', '"
+
publishing
+
"', '"
+
caPrice
+
"');"
;
Database::getInstance().sendExeCommand(buffer.c_str());
2:使用函数sprintf();
char
buffer[
200
]
=
"\0"
;
sprintf(buffer,
"update shopping set 购买时间 = now(), id = %d, 姓名 = '%s', \
级别 = '%s', 电话 = '%s', 邮箱 = '%s' where 书号 = %d;"
,\
m_iId, m_strName.c_str(), m_strLevel.c_str(), m_strPhone.c_str(),\
m_strMailAddress.c_str(), book->getId());
Database::getInstance().sendExeCommand(buffer);
第一种方式比较方便,但是有一个缺点,在进行“+”的时候,“=”右边的两个必须有一个是string类型,否则无法使用第一种方式。
C++程序结合MySQL主要是发送指令,也就是字符串的拼接,这其中可能会涉及很多的类型转换,sting转int,string转float等等,int转string, float转string等等。网上资料很多,有需要可以查询
注:在发送向MySQL时,上面的程序发送调用存储过程的指令会发送失败,但调用函数的不会,不太懂,希望大神告知原因,谢谢。
QQ:1786610699 倔强的木木 2017年9月27日