用于定义一个mysql对象,便于后续操作确定要操作的数据库是哪一个。
MYSQL mysql; //mysql标记对应某个数据库
用于定义一个行对象,其内容含有一行的数据。
MYSQL_ROW row; //row[i]可用于输出该行第i个字段的数据
用于定义一个存储字段信息的对象。
MYSQL_FIELD *field; //field->name存储对应字段名称
用于定义一个存储数据库检索信息结果的对象。
MYSQL_RES *result;
其实在操作mysql数据库时,最常使用的函数有以下几个:
用于初始化一个MYSQL对象,来连接mysql服务端。
//原型
MYSQL *mysql_init( MYSQL *mysql );
//example
MYSQL mysql;
mysql_init( &mysql );
用于连接数据库
//原型
MYSQL *mysql_real_connect (
MYSQL *mysql, //初始化的MYSQL对象,与mysql_init()对应,就是mysql操作具柄
const char *host, //主机地址,链接mysql所在的IP
const char *user, //用户,就是拿那个用户身份登陆mysql,例如:root
const char *passwd, //数据库的密码...
const char *db, //要连接的数据库,例如:student
unsigned int port, //端口,一般为3306
const char *unix_socket, //一般为NULL
unsigned long client_flag); //一般为0
//example
if(mysql_real_connect( &mysql, "localhost", "root",
"mypasswd", "student", 0, NULL, 0 ) == NULL)
{
printf("链接失败!%s\n",mysql_error(&mysql));
}
用于执行mysql命令。其参数应使用c风格字符串。
//原型
int mysql_query( MYSQL *mysql, char * command );
//example
string command = "select * from info";
int ret = mysql_query( &mysql, command.c_str() );
if(ret < 0)
{
printf("出错了!%s\n",mysql_error(&mysql));
}
用于获取mysql操作的检索结果。
//原型
MYSQL_RES *mysql_store_result(MYSQL *mysql);
//example
MYSQL_RES *result;
result = mysql_store_result( &mysql );
用于获取结果集的行数。
//原型
int mysql_num_rows( MYSQL_RES *result );
int rows = mysql_num_rows(result )
用于获取结果集的字段数(列数)。
//原型
int mysql_num_fields( MYSQL_RES *result );
//example
int fields;
fields = mysql_num_fields( result );
用于获取下一个字段的类型。
//原型
MYSQL_FIELD* mysql_fetch_field(MYSQL_RES *result);
从结果集中获取下一行,调用一次获取一行数据,结束返回NULL。
//原型
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
//example
MYSQL_ROW row;
while( row = mysql_fetch_row( result ), row != NULL ) {
for( int i = 0; i < num; i++ ) {
cout << row[i] << "\t\t";
}
cout << endl;
}
给定字段序号,返回字段类型,结束返回NULL。
MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES *result, int i);
//example
int num = mysql_num_fields( result ); //返回字段个数
for( int i = 0; i < num; i++ ) {
field = mysql_fetch_field_direct( result, i ); //返回字段类型
cout << field->name << "\t\t"; //输出字段名
}
cout << endl;
释放结果结合
mysql_free_result(MYSQL_RES *result);
设置编码方式
//原型
mysql_set_character_set(MYSQL *mysql,const char* csname)
mysql_set_character_set(connect_fd,"utf8");
用于关闭连接。
mysql_close( MYSQL *mysql );
#include
#include
#include
using namespace std;
class MysqlDB {
private:
MYSQL mysql;
MYSQL_ROW row;
MYSQL_RES *result;
MYSQL_FIELD *field;
public:
MysqlDB()
{
if( mysql_init( &mysql ) == NULL )
{
cout << "init error, line: " << __LINE__ << endl;
exit(-1);
}
}
~MysqlDB()
{
mysql_close( &mysql );
}
void connect( string host, string user, string passwd, string database )
{
if( !mysql_real_connect( &mysql, host.c_str(), user.c_str(), passwd.c_str(), database.c_str(), 0, NULL, 0 ) )
{
cout << "connect error, line: " << __LINE__ << endl;
exit(-1);
}
}
void add();
void print();
};
void MysqlDB::add()
{
string id, name, sex, birthday;
do {
cout << "请输入学生信息:\n";
cin >> id >> name >> sex >> birthday;
string sql = "insert into info values('" + id + "', '" + name +
"', '" + sex + "', '" + birthday + "');";
mysql_query( &mysql, sql.c_str() );
cout << "是否继续(y/n): ";
cin >> id;
} while( id == "y" );
}
void MysqlDB::print()
{
// string sql = "select * from info where name = '" + name + "';"; //要有''
string sql = "select * from info;";
mysql_query( &mysql, sql.c_str() );
result = mysql_store_result( &mysql );
if( !result )
{
cout << "result error, line : " << __LINE__ << endl;
return ;
}
int num = mysql_num_fields( result ); //返回字段个数
for( int i = 0; i < num; i++ ) {
field = mysql_fetch_field_direct( result, i ); //返回字段类型
cout << field->name << "\t\t"; //输出字段名
}
cout << endl;
while( row = mysql_fetch_row( result ), row )
{
for( int i = 0; i < num; i++ )
{
cout << row[i] << "\t\t";
}
cout << endl;
}
}
int main()
{
MysqlDB db;
db.connect( "localhost", "root", "niliushall", "student" );
db.print();
db.add();
db.print();
return 0;
}