Linux c操作mysql數據庫

【啓動mysql服務】

Service mysql start

【啓動mysql登陸】

mysql -u root –p

 

添加一個用戶

Create database db1 character set utf8;

grant all on db1.* to dbuser1 identified by 'dbuser1';//db1下的所有數據授權給dbuser1,密碼爲dbuser1

用該用戶登陸

mysql -u dbuser1 –p

 

在頭文件目錄裏沒有mysql.h頭文件

ubuntu:audo apt-get install libmysqlclient-dev

centos下 : yum install mysql-devel

 

頭文件的名字是以/usr/include爲基路徑,往後加上所在<路徑名/文件名.h>

如#include<sys/stat.h>

 

Makefile文件中連接時加上-mysqlclient 意思是要連接到libmysqlclient.so這個庫

 

Mysqlclientserver也是TCP協議

1, 初始化client

2, 建立連接

3, 接收和交互

 

數據庫操作步驟與函數:

1

MYSQL mysql;

//初始化mysql對象,相當於初始化了一個TCPsocket對象,同時初始化sql的內存和一些結構

mysql_init(&mysql);

 

2

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)

• 第一個參數應該是一個現存MYSQL結構地址。在調用mysql_real_connect()之前,你必須調用mysql_init()初始化MYSQL結構。見下面的例子。

 

 host值可以是一個主機名或一個IP地址。如果hostNULL或字符串"localhost",假定是到本地主機的一個連接。如果OS支持套接字(Unix)或命名管道(Win32),使用他們而不是TCP/IP與服務器連接。

 

• user參數包含用戶的MySQL登錄ID。如果userNULL,假定是當前用戶。在Unix下,它是當前登錄名。在Windows ODBC下,必須明確地指定當前用戶名字。見16.4 怎樣填寫ODBC管理程序中各種域。

 

• passwd參數爲user包含口令。如果passwdNULL,只有在user表中對於有一個空白口令字段的用戶的條目將被檢查一個匹配。這允許數據庫主管設置MySQL權限,使用戶獲得不同的口令,取決於他們是否已經指定一個口令。注意:不要試圖在調用mysql_real_connect()前加密口令;口令加密自動被客戶API處理。

 

• db是數據庫名。如果db不是NULL,連接將缺省數據庫設置爲這個值。

 

• 如果port不是0,值對於TCP/IP連接將用作端口號。注意host參數決定連接的類型。

 

• 如果unix_socket不是NULL字符串指定套接字或應該被使用的命名管道。注意host參數決定連接的類型。

 

• client_flag值通常是0,但是在很特殊的情況下可以被設置爲下列標誌的組合:

標誌名字 意味着的標誌

CLIENT_FOUND_ROWS 返回找到的(匹配的)行數,不是受到影響的行數。

CLIENT_NO_SCHEMA 不允許db_name.tbl_name.col_name語法。這是爲了ODBC;如果你使用該語法,導致語法分析器產生一個錯誤,它是爲在一些ODBC程序捕捉錯誤是有用的。

CLIENT_COMPRESS 使用壓縮協議。

CLIENT_ODBC 客戶是一個ODBC客戶。這使mysqld變得對ODBC更友好。

2.1.3 返回值

如果連接成功,一個 MYSQL*連接句柄。如果連接失敗,NULL。對一個成功的連接,返回值與第一個參數值相同,除非你傳遞NULL給該參數。

例:

pconnection = mysql_real_connect(&mysql, "localhost", "dbuser1", "dbuser1",

"db1", 0, 0, 0);

if (pconnection == NULL)

{

fprintf(stderr, "%s", "mysqlerror\n");

exit(1);

}

打印錯誤

mysql_error(&mysql);

例:

pconnection = mysql_real_connect(&mysql, "localhost", "dbuser1", "dbuser1",

"db1", 0, 0, 0);

if (pconnection == NULL)

{

perror(mysql_error(&mysql));

exit(1);

}

關閉連接

mysql_close(pconnction);

 

執行sql語句:

int mysql_query(MYSQL* mysql,const char* sql);

mysql:連接的指針

sql:sql語句

返回:成功返回0,失敗返回非0

執行之前必須先設置字符集,包括文件的編碼。

 

system(sty erase ^H); //設置控制檯退格不回顯

例:

int main(int argc, char* argv[])

{

MYSQL mysql, *pconnection;

//初始化mysql對象,相當於初始化了一個TCPsocket對象

mysql_init(&mysql);

pconnection = mysql_real_connect(&mysql, "localhost", "dbuser1", "dbuser1",

"db1", 0, 0, 0);

if (pconnection == NULL)

ERR_EXIT(mysql_error(&mysql));

//確保客戶端與server字符集相同,不然會出現程序出現漢字並且作爲where條件,不識別也不報錯

int ret = mysql_query(pconnection, "set names utf8");

if (ret != 0)

ERR_EXIT(mysql_error(&mysql));

// char *sql = "delete from people where id >15";

char *con = argv[1];

char p[10];

char name[100];

memset(name,0,sizeof(name));

memset(p,0,sizeof(p));

printf("請輸入條件1");

//read(STDIN_FILENO,name,sizeof(name));

fgets(p,sizeof(p),stdin);

p[strlen(p)-1]=0;//將最後一位\n設爲NULL(因爲你再輸入後敲了個回車)

printf("請輸入條件2");

fgets(name,sizeof(name),stdin);

name[strlen(name)-1]=0;

char sql[1024];

memset(sql,0,sizeof(sql));

sprintf(sql,"delete from people where %s%s'%s'",con,p,name);

printf("%s\n",sql);

ret = mysql_query(pconnection, sql);

if (ret != 0)

ERR_EXIT(mysql_error(&mysql));

mysql_close(pconnection);

return 0;

}

查詢語句

MYSQL_RES  *mysql_store_result(MYSQL *pmysql);

pmysql:打開的連接指針

成功返回一個查詢結果指針,失敗或查詢無結果返回NULL(不能用其判斷查詢結果爲空)

 

查看查詢結果

MYSQL_ROW  mysql_fetch_row(MYSQL_RES  * result);

 

查看查詢結果中的字段信息:

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES  * result);

 

釋放查詢資源

mysql_free_result(MYSQL_RES* pres);//調用完mysql_store_result一定要用其釋放資源

 

例:查詢

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <mysql/mysql.h>

#define ERR_EXIT(m)\

do {perror(m);\

exit(EXIT_FAILURE);\

} while(0)

int main(int argc, char* argv[])

{

MYSQL mysql, *pconnection;

//初始化mysql對象,相當於初始化了一個TCPsocket對象

mysql_init(&mysql);

pconnection = mysql_real_connect(&mysql, "localhost", "dbuser1", "dbuser1",

"db1", 0, 0, 0);

if (pconnection == NULL)

ERR_EXIT(mysql_error(&mysql));

//確保客戶端與server字符集相同,不然會出現程序出現漢字並且作爲where條件,不識別也不報錯

int ret = mysql_query(pconnection, "set names utf8");

if (ret != 0)

ERR_EXIT(mysql_error(&mysql));

char *sql = "select * from people";

ret = mysql_query(pconnection, sql);

if (ret != 0)

ERR_EXIT(mysql_error(&mysql));

 

MYSQL_RES *result;

result = mysql_store_result(pconnection);

//查詢字段

MYSQL_FIELD *field;

int count = 0;

while (1)

{

field = mysql_fetch_field(result);

if (field == NULL)

break;

printf("%s\t",field->name);

count++;

}

printf("\n");

//查詢記錄

MYSQL_ROW row;

while (1)

{

row = mysql_fetch_row(result);

if (row == NULL)

break;

int i;

for(i = 0; i < count ;i++)

printf("%s\t", row[i]);

printf("\n");

}

 

mysql_free_result(result);

mysql_close(pconnection);

return 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章