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()
}
* */
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;
}