VC使用C API 連接操作MySQL數(shù)據(jù)庫(kù)
一切盡在代碼中,代碼中也太多了if/else,可以對(duì)它進(jìn)行更好的函數(shù)及至類的封裝,規(guī)范的處理好異常。
-
#include <windows.h>
- //需要在VC的Options設(shè)置一個(gè)include路徑指向'%mysql_home%/inlude'目錄
-
#include <mysql.h>
- //設(shè)置一個(gè)lib路徑指向'%mysql_home%/lib/opt'目錄 (mysql5.0是個(gè)目錄)
- #pragma comment(lib,"libmysql.lib")
- #define host_name "localhost" //數(shù)據(jù)庫(kù)服務(wù)器
- #define db_name "test" //數(shù)據(jù)庫(kù)名
- #define user_name "root" //用戶名
- #define password "" //密碼
- int main( int argc, char * argv[]) {
- char szSqlText[500] ;
- MYSQL *conn;
- MYSQL_RES *rs;
- MYSQL_ROW row; //注意它的聲明 typedef char **MYSQL_ROW,字符串?dāng)?shù)組
- BOOL bCreate = FALSE;
- conn = mysql_init(NULL);
- if (conn == NULL)
- {
- fprintf(stderr, "mysql_init() failed (probably out of memory)\n" );
- exit(1);
- }
- if (mysql_real_connect(conn,host_name,user_name,password,
- db_name,MYSQL_PORT,NULL,0) == NULL)
- {
- //在MYSQL初始化之后的操作如果有錯(cuò)誤,可以用mysql_errno(MYSQL*)和
- //mysql_errer(MYSQL*) 分別獲得出錯(cuò)代號(hào)和描述
- fprintf(stderr, "mysql_real_connect() failed:\nError %u (%s)\n" ,
- mysql_errno(conn),mysql_error(conn));
- exit(1);
- }
- printf( "connect to db successful.\n" );
- if (bCreate) {
- //第一次運(yùn)行創(chuàng)建一個(gè)表mytable
- sprintf(szSqlText, "create table mytable(time datetime,s1 char(6),s2 char(11),s3 int,s4 int)" );
- if (mysql_query(conn,szSqlText)) {
- printf( "Can't create table.\n" );
- mysql_close(conn);
- return 0;
- }
- }
- sprintf(szSqlText, "insert into mytable values('2000-3-10 21:01:30','Test','MySQLTest',2000,3)" );
- if (mysql_query(conn,szSqlText)) {
- printf( "Insert values error:\nError %u (%s)\n" ,
- mysql_errno(conn),mysql_error(conn));
- mysql_close(conn);
- return 0;
- }
- else {
- //insert/delete/update 語(yǔ)句可用mysql-affected_rows()得到受作用的行
- printf( "INSERT statement succeeded: %lu rows affected\n" ,
- (unsigned long )mysql_affected_rows(conn));
- }
- //查詢數(shù)據(jù)
- sprintf(szSqlText, "select * from mytable" );
- //執(zhí)行成功則返回零
- if (mysql_query(conn,szSqlText) != 0) {
- mysql_close(conn);
- return 0;
- }
- else {
- //立即從服務(wù)器返回所有行,存儲(chǔ)到本地,產(chǎn)生結(jié)果集,失敗則返回NULL
- rs = mysql_store_result(conn);
- //結(jié)果集是保留在服務(wù)器上,fetch_row時(shí)才逐行從服務(wù)器上取
- //rs = mysql_use_result(conn);
- //Get query result.
- int count = ( int )mysql_num_rows(rs);
- printf( "Query: %s.\n%ld records found.\n" ,szSqlText,count);
- //MYSQL_ROW是一個(gè)指向數(shù)值數(shù)組的指針,row[0],row[1]...row[列數(shù)-1]
- //所有的數(shù)據(jù)類型都以字符串返回,即使是數(shù)字型,要進(jìn)行串轉(zhuǎn)換
- //NULL指針代表數(shù)據(jù)庫(kù)字段的NULL,應(yīng)經(jīng)常檢查列是否為NULL
- while ((row = mysql_fetch_row(rs)) != NULL){ //返回NULL,則說(shuō)明不再有行
- for (unsigned int i=0; i<mysql_num_fields(rs);i++){
- if (i>0)
- fputc('\t',stdout);
- printf( "%s" ,row[i]!=NULL ? row[i]: "NULL" );
- }
- fputc('\n',stdout);
- }
- //使用完后,釋放結(jié)果集占用內(nèi)存
- mysql_free_result(rs);
- }
- mysql_close(conn);
- return 0;
- }
- //最后,注意查詢語(yǔ)句中字符串的轉(zhuǎn)義 select a from t where a=''1',是要出錯(cuò)的
- //空字符轉(zhuǎn)換為'\0',這里的0 是可打印的ASCII 碼0,而不是空。
- //反斜線、單引號(hào)和雙引號(hào)分別轉(zhuǎn)換為‘\\’、‘\'’ 和‘\"’
- //你也可以用mysql_escape_string(to_str,from_str,from_len)轉(zhuǎn)換sql語(yǔ)句
connect to db successful.
INSERT statement succeeded: 1 rows affected
Query: select * from mytable.
8 records found.
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
2000-03-10 21:01:30 Test MySQLTest 2000 3
Press any key to continue
posted on 2008-04-08 14:50 隨意門 閱讀(640) 評(píng)論(0) 編輯 收藏 引用
