C/C++使用MySQL
一直找不到关于C/C++连接Mysql数据库的详细api书籍和网站,刷了下网页,找到一篇Linux 下C/C++连接数据库的博客,留着以后自己用。
首先需要编译、安装MySQL,安装完成后,将MySQL目录中的lib目录添加到环境变量中。新建C/C 工程,把$MYSQL_ROOT/include添加到编译环境的包含路径下面。在编译选项中,增加$MYSQL_ROOT/lib目录。在Link选项中增加-lmysqlclient(已经把lib目录增加到系统环境变量中),或者直接引用libmysqlclient.so文件。
1 不多说了,直接上代码,注释都很详细。 2 /* 3 * MySQLManager.h 4 * 5 * Created on: Feb 18, 2009 6 * Author: Steven Wee 7 */ 8 9 #ifndef MYSQLMANAGER_H_ 10 #define MYSQLMANAGER_H_ 11 12 #include "../Common/CheckStringTools.h" 13 14 #include < mysql.h> 15 16 #include < string> 17 #include < iostream> 18 #include < vector> 19 20 #include < string.h> 21 22 using namespace std; 23 24 class MySQLManager 25 { 26 public: 27 /* 28 * Init MySQL 29 * @param hosts: Host IP address 30 31 * @param userName: Login UserName 32 * @param password: Login Password 33 * @param dbName: Database Name 34 * @param port: Host listen port number 35 */ 36 MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port); 37 ~MySQLManager(); 38 void initConnection(); 39 /* 40 * Making query from database 41 * @param mysql: MySQL Object 42 * @param sql: Running SQL command 43 */ 44 bool runSQLCommand(std::string sql); 45 /** 46 * Destroy MySQL object 47 * @param mysql MySQL object 48 */ 49 void destroyConnection(); 50 bool getConnectionStatus(); 51 vector< vector< string> > getResult(); 52 protected: 53 void setUserName(std::string userName); 54 void setHosts(std::string hosts); 55 void setPassword(std::string password); 56 void setDBName(std::string dbName); 57 void setPort(unsigned int port); 58 private: 59 bool IsConnected; 60 vector< vector< string> > resultList; 61 MYSQL mySQLClient; 62 unsigned int DEFAULTPORT; 63 char * HOSTS; 64 char * USERNAME; 65 char * PASSWORD; 66 char * DBNAME; 67 }; 68 69 #endif /* MYSQLMANAGER_H_ */ 70 71 /* 72 * MySQLManager.cpp 73 * 74 * Created on: Feb 18, 2009 75 * Author: Steven Wee 76 */ 77 #include "MySQLManager.h" 78 79 MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port) 80 81 { 82 IsConnected = false; 83 this ->setHosts(hosts); // 设置主机IP地址 84 this ->setUserName(userName); // 设置登录用户名 85 this ->setPassword(password); // 设置登录密码 86 this ->setDBName(dbName); // 设置数据库名 87 this ->setPort(port); // 设置端口号 88 } 89 90 MySQLManager::~MySQLManager() 91 { 92 this ->destroyConnection(); 93 } 94 95 void MySQLManager::setDBName(string dbName) 96 { 97 if ( dbName.empty() ) 98 {// 用户没有指定数据库名 99 std::cout < < "DBName is null! Used default value: mysql" < < std::endl; 100 this ->DBNAME = new char[5]; 101 strcpy(this ->DBNAME, "mysql"); 102 } 103 else 104 { 105 this ->DBNAME = new char[dbName.length()]; 106 strcpy(this ->DBNAME, dbName.c_str()); 107 } 108 } 109 110 void MySQLManager::setHosts(string hosts) 111 { 112 if ( hosts.empty() ) 113 {// 用户没有指定数据库IP地址 114 std::cout < < "Hosts is null! Used default value: localhost" < < std::endl; 115 this ->HOSTS = new char[9]; 116 strcpy(this ->HOSTS, "localhost"); 117 } 118 else 119 { 120 this ->HOSTS = new char[hosts.length()]; 121 strcpy(this ->HOSTS, hosts.c_str()); 122 } 123 } 124 125 void MySQLManager::setPassword(string password) 126 {// 用户没有指定密码 127 if ( password.empty() ) 128 { 129 130 std::cout < < "Password is null! Used default value: " < < std::endl; 131 this ->PASSWORD = new char[1]; 132 strcpy(this ->PASSWORD, ""); 133 } 134 else 135 { 136 this ->PASSWORD = new char[password.length()]; 137 strcpy(this ->PASSWORD, password.c_str()); 138 } 139 } 140 141 void MySQLManager::setPort(unsigned int port) 142 {// 用户没有指定端口号,使用默认端口号 143 if ( port ) 144 { 145 std::cout < < "Port number is null! Used default value: 0" < < std::endl; 146 this ->DEFAULTPORT = 0; 147 } 148 else 149 { 150 this ->DEFAULTPORT = port; 151 } 152 } 153 154 void MySQLManager::setUserName(string userName) 155 {// 用户没有指定登录用户名 156 if ( userName.empty() ) 157 { 158 std::cout < < "UserName is null! Used default value: root" < < std::endl; 159 this ->USERNAME = new char[4]; 160 strcpy(this ->USERNAME, "root"); 161 } 162 else 163 { 164 this ->USERNAME = new char[userName.length()]; 165 strcpy(this ->USERNAME, userName.c_str()); 166 } 167 } 168 169 void MySQLManager::initConnection() 170 { 171 if ( IsConnected ) 172 {// 已经连接到服务器 173 std::cout < < "Is connected to server!" < < std::endl; 174 return; 175 } 176 mysql_init(&mySQLClient);// 初始化相关对象 177 if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, 0) ) 178 179 {// 连接到服务器 180 std::cout < < "Error connection to database: %s\n" < < mysql_error(&mySQLClient) < < std::endl; 181 } 182 IsConnected = true;// 修改连接标识 183 } 184 185 bool MySQLManager::runSQLCommand(string sql) 186 { 187 if ( !IsConnected ) 188 {// 没有连接到服务器 189 std::cout < < "Not connect to database!" < < std::endl; 190 return false; 191 } 192 if ( sql.empty() ) 193 {// SQL语句为空 194 std::cout < < "SQL is null!" < < std::endl; 195 return false; 196 } 197 198 MYSQL_RES *res; 199 MYSQL_ROW row; 200 201 unsigned int i,j = 0; 202 203 StringTools stringTools; 204 sql = stringTools.filterString(sql); 205 206 i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));// 执行查询 207 if ( i ) 208 { 209 std::cout < < "Error query from database: %s\n" < < mysql_error(&mySQLClient) < < std::endl; 210 return false; 211 } 212 res = mysql_store_result(&mySQLClient); 213 vector< string> objectValue; 214 while( (row = mysql_fetch_row(res)) ) 215 {// 遍历结果集 216 objectValue.clear(); 217 for ( j = 0 ; j < mysql_num_fields(res) ; j ) 218 { 219 objectValue.push_back(row[j]); 220 } 221 this ->resultList.push_back(objectValue); 222 } 223 mysql_free_result(res); //free result after you get the result 224 225 226 227 return true; 228 } 229 230 vector< vector< string> > MySQLManager::getResult() 231 { 232 return resultList; 233 } 234 235 void MySQLManager::destroyConnection() 236 { 237 mysql_close(&mySQLClient); 238 this ->IsConnected = false; 239 } 240 241 bool MySQLManager::getConnectionStatus() 242 { 243 return IsConnected; 244 }
来自:http://club.topsage.com/forum.php?mod=viewthread&tid=2129419
手与大脑的距离决定了理想与现实的相似度