mysql數據庫--常用API

0準備

  • 這時編譯時所需要鏈接的庫
    在這裏插入圖片描述

1基礎函數

1.1初始化

  • 分配和初始化與mysql_real_connect() 相適應的MYSQL對象
  • 如果mysql是NULL指針,該函數將分配,初始化,並返回新對象 否則將初始化對象,並返回對象地址,
  • 如果mysql_init分配了新的對象,在結束時應該調用mysql_close來關閉連接,釋放新對象
  • 函數原型
MYSQL *mysql_init(MYSQL *mysql)
  • 用法
MYSQL* mysql=mysql_init(MYSQL *mysql);
	if(mysql==NULL){
		printf("mysql init error\n");
	}
	printf("mysql init success\n");
  • 返回值
    初始化MYSQL句柄,如果無足夠內存分配新對象 返回NULL

1.2錯誤處理

unsigned mysql_errno(MYSQL *mysql)
char *mysql_error(MYSQL *mysql)

1.3建立連接

  • 此函數嘗試與運行的主機上的Mysql數據引擎進行連接,在你能夠執行需要有效MYSQL連接局柄結構的任何其他API函數之前 此函數必須完成
  • 函數原型
MYSQL *mysql_real_connect(MYSQL *mysql,                              |
                        const char* host,                             |主機名或ip 
                        const char* user,                             |用戶
                        const char* password,                         |用戶密碼
                        const char* db,                               |數據庫名稱
                        unsigned int port,                            |如果port不是零,將其值作爲TCPIP的端口使用
                        const char* unix_socket,                      | 不是NULL 應使用的socket或者命名管道
                        unsigned long client_flag                     |通常傳零
);
  • 代碼
MYSQL *conn=mysql_real_connect(mysql,"locahost","root","123456","lvke",0,NULL,0);
    if(conn==NULL){
        printf("mysql connect error [%s]\n",mysql_error(conn));
    }
  • 返回值:如果連接成功 返回mysql連接局柄 若連接失敗 返回NULL 對於成功的連接 返回值與第一個參數相同

1.4執行SQL語句

  • 注意:mysql_query不能用於包含2進制的數據查詢,查詢2進制應該使用mysql_real_query,因爲2進程可能包含\0 mysql_query會將其當作結束標誌
  • 函數原型
int mysql query(MYSQL* mysql,const char* stmt_str)  
  • 用法
/執行sql語句
	char *pSQL="insert into mytest values(5,'bj_cp')";
	int ret=mysql_query(mysql,pSQL);
	if(ret!=0){
		          printf("mysql query error [%s]\n",mysql_error(conn));
		}	
	//如果表有主鍵 則重複插入就會有錯誤

1.5獲取列數 列名

  • 函數原型
unsigned int mysql_field_count(MYSQL *mysql) //從mysql局柄中獲取有多少列
Unsigned int mysql_num_field(MYSQL_RES *result) //從返回的結果集獲取有多少列
  • 用法
//獲取列數
	int num1=mysql_field_count(conn);
	int num =mysql_num_field(result);

1.6獲取表頭信息

  • 函數原型
MYSQL_FIELD * mysql_fetch_fields(result);
  • 用法
/獲取表頭信息
	MYSQL_FIELD * field=mysql_fetch_fields(result);
	if(field==NULL){
		    printf("mysql FETCH fields error [%s]\n",mysql_error(mysql));	
	}
	for(i=0;i<num;i++){
		printf("%s ",field[i].name);
	}
	printf("\n");

1.7獲取結果/解析結構集/釋放結果集

  • 函數原型
MYSQL_RES *mysql_store_result(MYSQL* mysql);
MYSQL_ROW mysql_fetch_row(MYSQL_RES * result);
void mysql_free_result(MYSQL_RES* result);
  • 用法
//獲取結果集
	MYSQL_RES *result=mysql_store_result(conn);
	if(result==NULL){
		          printf("mysql store result error [%s]\n",mysql_error(mysql));	
	}
//獲取列數
	int num1=mysql_field_count(conn);
//循環獲取每一條記錄
	MYSQL_ROW row;
	while(row=mysql_fetch_row(result)){
		//row的下表限制和列數有關
		for(i=0;i<num;i++){
			printf("%s ",row[i]);
		}
		printf("\n");
	}
//釋放結果集
mysql_free_result(result);

1.7關閉連接

void mysql_close(MYSQL* mysql)

在這裏插入圖片描述

2 實現mysql_client

模擬mysql客戶端程序的思路
1:調用mysql_init函數進行初始化
2:調用mysql_real_connect連接數據庫
3:進入while()循環{
		//打印提示符>mysql
		//等待用戶輸入mysql語句
		
		//判斷用戶輸入的語句是否爲quit或者exit
		if(strncasecmp(sql,"quit",4)==0 ||strncasecmp(sql,"exit",4)){
			exit(1);//退出程序
		}

		//如果不是quit/exit 那就是sql執行語句

		//先判斷是否爲select語句
		//不是selec語句
		if(strncasecmp(sql,"select",6)!=0){
			//打印行數
			mysql_affect_rows();
			continue;
		}
		//是select語句
		//獲取列數
		//獲取表頭
		//打印表頭
		//獲取結果集
		//解析結構集 獲取每行記錄
		while(row=mysql_fetch_row){
		
			for(i=0;i<num;i++){
				printf("%s",row[i]);
				printf("\n");
			}
		}
		//釋放結果集
		mysql_free_result()
		//關閉連接
		mysql_close()
}
 * */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

nt main(){
			//初始化
		  //MYSQL *mysql_init(MYSQL *mysql)
		   MYSQL* mysql=mysql_init(MYSQL *mysql);
			if(mysql==NULL){
					printf("mysql init error\n");
		    }
					printf("mysql init success\n		");
			//連接數據庫
			 MYSQL *conn=mysql_real_connect(mysql,"locahost","root","123456","scott",0,NULL,0);
			if(conn==NULL){
				printf("mysql connect error [%s]\n",mysql_error(conn));
			}
				printf("mysql connect succ ");
			//獲取當前的字符集
			printf("character-----%s------\n",mysql_character_set_name(conn));
			//設置默認使用的編碼集
			mysql_set_character_set(conn,"utf8");
			//查看修改後的字符集			
			

				int rec;
				int i;
				int num;
				int len;
				char buf[1024];		
			 //循環等待用戶輸入語句
			 while{
					//打印提示符 要加上字符長度 要不然默認行緩衝 不會顯示出來
					write(STDOUT_FILENO,"mysql>",strlen("mysql>"));
					
					//接受用戶輸入
					memset(buf,0,sizeof(buf));
					read(STDIN_FILENO,buf,sizeof(buf));
					//去掉字符串後面有個換行符
					buf[strlen(buf)-1]='\0';
					//若buf中包含分號 則去掉分號
					char *p=strr(buf,";");
					if(p!=NULL){
						*p='\0';
					}
					//過濾掉buf前面的空格
					for(i=0;i<strlen(buf),i++){
						if(buf[i]==' '){
							continue;
						}else{
							break;
						}
					}
					memmove(buf,buf+i,strlen(buf)-i);
					buf[strlen(buf)-i]='\0';
					printf("BUF==[%s]\n",buf);
					

					//判斷用戶輸入是否爲exit或者quit
					if(strncasecmp(sql,"quit",4)==0 ||strncasecmp(sql,"exit",4)){
						mysql_close(conn);
						exit(1);//退出程序
			        	}
					
					//執行sql語句
					int ret=mysql_query(conn,buf);
						if(ret!=0){	
							printf("mysql query error [%s]\n",mysql_error(conn));                                                      
							continue;
						}
					//判斷是否爲select語句 
					//不是:只打印影響的行數
					if(strncasecmp(buf,"select",6)!=0){
						printf("Query ok,%d row affected\n",mysql_affect_rows(conn));
						continue;
					}

					//是select語句
					//獲取結果集
					MYSQL_RES *result=mysql_store_result(conn);
					if(result==NULL){
						printf("mysql_store_result error [%s]\n",mysql_error(conn));
						continue;
					}
					//獲取列數
					num=mysql_num_fields(result);

					//獲取表頭信息
					MYSQL_FIELD *fields=mysql_fields(result);
					if(fields==NULL){ 
						printf("mysql_store_result error [%s]\n",mysql_error(conn));
						mysql_free_result(result);
						continue;
					}
					//打印表頭
					for(i=0;i<num;i++){
						printf("%s ",fields[i].name);
					}
					printf("\n");
					//釋放j結構集
					mysql_free_result(result);
					MYSQL_ROW row;
					while(row=mysql_fetch_row(result)){
						for(i=0;i<num;i++){
							printf("%s ",row[i]);
						}

						printf("\n");
					}
				
			 }
			 mysql_close(conn);
			 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章