linux下c 上傳圖片到mysql_Linux下C連接MySql數據庫

 2023-12-10 阅读 21 评论 0

摘要:其實寫這個程序真的很簡單,十多分鐘的事情,只是以前沒在Linux下用純C連過Mysql,想試一下,竟然搞了一整天,而且不是由于編碼本身,是因為其他的一些周邊問題,所以很有必要做一下筆記。一、解決小的問題:1、怎么自己去學

其實寫這個程序真的很簡單,十多分鐘的事情,只是以前沒在Linux下用純C連過Mysql,想試一下,竟然搞了一整天,而且不是由于編碼本身,是因為其他的一些周邊問題,所以很有必要做一下筆記。

一、解決小的問題:

1、怎么自己去學著編寫?

C語言針對MySql函數的幫助怎么查找:這些東西在MySql提供的幫助文檔里都是有的,索引是C API。可以自己去下載chm格式的幫助文檔,個人覺得這種文檔比較好用,也可以去官網自行決定下載其他類型的幫助文檔:http://dev.mysql.com/doc/,或者在線查找:https://dev.mysql.com/doc/refman/5.1/zh/apis.html。用高級語言編程其實就是學會使用幫助文檔并付諸實踐的過程。

2、在編寫之前請確定自己有相關的頭文件和庫文件

關于這點,需要做點準備工作:

1、安裝mysql:

sudo apt-get install mysql-server

2、安裝庫文件和頭文件:

sudo apt-get install libmysqlclient-dev

也可以自己去官網下載對應mysql的安裝包進行安裝:http://dev.mysql.com/downloads/mysql/,單獨下載connector的rpm或者tar包:http://dev.mysql.com/downloads/connector/。

如果是tar壓縮包,解壓出來,把include文件夾復制(cp命令,需root權限)到/usr/include/mysql/中,然后將lib文件夾復制到/usr/lib/mysql/中。

3、偶遇奇怪問題?fatal error: mysql/plugin_auth_common.h

這個問題其實不是什么大問題,是頭文件引用的時候相對路徑不對,如果編譯器提示你某個頭文件不存在,但是你在那個文件夾里查看又發現這個頭文件其實是存在的。

比如說題述問題,我們在Linux下用C連mysql的時候要包含頭文件:#include,編譯的時候編譯器提示錯誤,不存在?

其實我們可以找到的是/usr/include/mysql/mysql/plugin_auth_common.h,然后,把該頭文件復制到父級目錄即可,編譯器就能正確找到這個頭文件。

其實都是相對路徑的問題。

4、怎么用GCC命令正確編譯:

比如寫好的文件為main.c,轉到文件所在目錄(cd命令),然后進行編譯,并嘗試執行:

gcc -o conn main.c -l mysqlclient

chmod +x conn

./conn

如果不加-lmysqlclient 鏈接選項的話,一般會提示undefined reference to `mysql_init' ,其實是因為init是最開始被調用的函數,所以它就最先提示這個而已。

如果想要調試的話可以用gdb,不過我自己用得都不是很熟,所以就不多說了。

5、Eclipse(Kepler-Cpp)構建針對MySql的開發環境:

Project->Properties->Settings->Cross GCC Compiler->Includes->Include paths(-I),包含如下兩個路徑:

/usr/include/mysql和/usr/lib/mysql,如圖:

ff70239b490b0462798fe6b6758a2053.png

然后在Cross GCC Linker->Libraries中的Libraries(-I)中添加link:mysqlclient,在Library search path(-L)中添加路徑/usr/lib/mysql,如圖:

b5e6edef4523f1b58549a5ae422f9b6c.png

本來一開始我是在QtCreator里面寫的,編譯的時候發現不知道哪里加-l mysqlclient這個鏈接選項,沒辦法,一點都不會用qmake,也不會用cmake,然后就想用Eclipse來寫,然后又發現Eclipse沒辦法識別mysql的那些頭文件,于是又折騰了一陣子。寫倒不是問題,主要是這些IDE調試的時候比較方便(其實也主要是因為不太會用GDB),唉,各種碰壁。

二、大問題,如果你不小心把/usr/lib的所屬用戶改了導致sudo命令用不了:

這個不相關的問題是怎么來的?其實就是因為編譯器提示某個頭文件找不到,我以為是當前用戶沒權限去訪問/usr/lib/mysql文件夾里面的庫文件(這個文件夾是cp過去的,當時我也不清楚它的權限狀態)。于是我把/usr/lib/mysql文件夾的所屬用戶改成了nerohwang,而且還重啟了計算機,悲劇了。

重新進入系統以后,每次使用sudo命令的時候都提示,/usr/lib下的某文件出錯,該文件的所屬用戶必須是UID為0的用戶(其實就是root用戶)。

可想而知,一個使用Linux系統的人無法通過sudo來獲取root權限是什么感覺,感覺就是什么事情都做不了。沒錯,可以通過su命令來變成root用戶,但是我是沒有對root指定密碼的,所以沒有辦法,甚至一度想過對系統進行重裝(自殺)。

后來想到去Windows系統下用軟碟通(UltrISO)寫一個Ubuntu系統到U盤里,然后U盤啟動以后選試用Ubuntu而不是安裝。進到試用系統后,獲取根用戶權限(竟然不用密碼),然后將原系統的那些文件權限恢復:

sudo su

cd /你平時用的Linux根目錄的路徑(桌面系統會幫你把這個系統掛載上,你可以點選以后通過右鍵--屬性選項查看)

chown -R root:root /usr/lib

chown -R root:root /usr/include

上面所說的,桌面系統會幫你掛載那個分區,當然也可以自行掛載:

fdisk -l ? ? ? -------查看分區情況,比如說我們發現那個系統分區在/dev/sda1上:

mount /dev/sda1 /mnt/DirName ? ? ? ?--需要根用戶權限

重啟,進入系統,恢復正常。所以說,根目錄的東西不要去亂搞。

三、C連接MySql編程本身:

其實這個最沒什么好說的,不過最后還是寫了個Demo 。

開始建表如下:

fe17928432d2d0f9b5e7b3f0c369e79d.png

id為INT,主鍵,AUTO_INCREMENT,text為varchar(15)。

程序源碼:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /*Author:nerohwang2 Date:2014/3/7*/

3 #include

4 #include

5 #include

6 #include

7 #define INSERT_QUERY "INSERT INTO tblTest(text) values(?)"

8 void main(void)9 {10 size_t break_point = 0;11 printf("Hello World!\n");12 MYSQL *conn;13 MYSQL mysql;14 MYSQL_RES *mysql_res;15 MYSQL_ROW *mysql_row;16 MYSQL_FIELD *mysql_field;17 MYSQL_STMT *mysql_stmt;18 unsigned intnum_fields;19 const char * server = "localhost";20 const char *user = "root";21 const char *passwd = "cc527888";22 const char *dataBase = "dbTest";23 const char *query_select = "select * from tblTest";24 conn =mysql_init(NULL);25 if(!mysql_real_connect(conn,server,user,passwd,dataBase,0,NULL,0))26 {27 fprintf(stdout,"Error connecting to Mysql: %s\n",mysql_error(conn));28 }29 int t =mysql_query(conn,query_select);30 if(t) //t=0 means correct

31 {32 fprintf(stderr,"Query error occurs:%s\n",mysql_error(conn));33 }34

35 mysql_res =mysql_use_result(conn);36 if(mysql_res ==NULL)37 {38 fprintf(stderr,"Query error occurs: %s!\n",mysql_error(conn));39 }40 num_fields =mysql_num_fields(mysql_res);41 unsigned int num_rows =mysql_num_rows(mysql_res);42 printf("There're %d columns in the table tblTest\n",num_fields);43 //The code below won't return correct result until all rows in result_Set have been retieved

44 printf("There're %d rows affected in the table tblTest\n",num_rows);45 mysql_field =mysql_fetch_fields(mysql_res);46 unsigned int i=0;47 for(i=0; i< num_fields; i++)48 {49 printf("Field %u is %s\t",i,mysql_field[i].name);50 }51 printf("\n");52 size_t i_temp=0;53 while((mysql_row=mysql_fetch_row(mysql_res)))54 {55 printf("The ID %d is %s\n",++i_temp,mysql_row[1]);56 }57 num_rows =mysql_num_rows(mysql_res);58 printf("There're %d rows affected in the table tblTest\n",num_rows); //Now ,it's correct59

60

61 //Insert operation//62 if(!(mysql_stmt=mysql_stmt_init(conn)))63 {64 fprintf(stderr,"Statement initialization failed: %s\n",mysql_stmt_error(mysql_stmt));65 exit(0);66 }67 if(mysql_stmt_prepare(mysql_stmt,INSERT_QUERY,strlen(INSERT_QUERY))) //0 means correct

68 {69 fprintf(stderr,"Statament preparation failed:%s and %s\n",mysql_error(conn),mysql_stmt_error(mysql_stmt));70 exit(0);71 }72 fprintf(stdout,"Init and preparation succeeded!\n");73 MYSQL_BIND bind[1];74 memset(bind, 0, sizeof(bind));75 char *ch = "test_in";76 int lengthCH =strlen(ch);77 bind[0].buffer_type =MYSQL_TYPE_VARCHAR;78 bind[0].buffer =ch;79 bind[0].is_null = 0;80 bind[0].length = &lengthCH;81 if(mysql_stmt_bind_param(mysql_stmt, bind))82 {83 fprintf(stderr, "mysql_stmt_bind_param() failed\n");84 fprintf(stderr, "%s\n", mysql_stmt_error(mysql_stmt));85 exit(0);86 }87

88 if(mysql_stmt_execute(mysql_stmt))89 {90 fprintf(stderr,"Execution failed:%s\n",mysql_stmt_error(mysql_stmt));91 exit(0);92 }93 my_ulonglong affected_rows=mysql_stmt_affected_rows(mysql_stmt);94 fprintf(stdout, "total affected rows(insert 1): %l\n",95 (unsigned long) affected_rows);96

97 if(mysql_stmt_close(mysql_stmt))98 {99 fprintf(stderr, "failed while closing the statement\n");100 fprintf(stderr, "%s\n", mysql_stmt_error(mysql_stmt));101 exit(0);102 }103 //Insert opration success104 mysql_close(conn);105 printf("End of the file\n");106 }

C_Mysql

執行若干次以后結果如下:

cf2a237a2087be5c020c8c76b02e6984.png

寫完,睡覺。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/194198.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息