Thứ Sáu, 22 tháng 10, 2010

Kết nối đến csdl Mysql sử dụng Ansi C

Kết nối đến csdl Mysql sử dụng Ansi C


Bài viết của mình được thực hiện trên Ubuntu nhé ( và Centos ) các bác sài win đi chỗ khác xem nhé  .

1. Cài đặt thư viện

sudo apt-get install libmysql++-dev

2. Code :

Dùng một Editor để soạn file C .

include header :

#include <mysql/mysql.h>

Kết nối :
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;

char *server ="localhost";
char *user = "root";
char *password = "1";
char *database = "mysql";

MYSQL_STMT    *stmt;
MYSQL_BIND    bind[2];

conn = mysql_init(NULL);
if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

Truy vấn :
if (mysql_query(conn, sql)) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(0);
}

res = mysql_use_result(conn);

while ((row = mysql_fetch_row(res)) != NULL)
{

printf("data  %d \n", row[0]));

}

Nhìn chung C API khá giống php API nên cũng không khó nắm bắt lắm .

Vấn đề chủ yêu nằm ở các kiểu dữ liệu giữa C và Mysql :

Để giải quyết vấn đề này nên sử dụng triệt để prepare statement :

ví dụ :
#define UPDATE_SQL "UPDATE articles category_id=? where article_id =? "

if (mysql_stmt_prepare(stmt, UPDATE_SQL, strlen(UPDATE_SQL)))
{
fprintf(stderr, " mysql_stmt_prepare(), UPDATE failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
fprintf(stdout, " prepare, INSERT successful\n");

printf("a");

memset(bind, 0, sizeof(bind));

/* INTEGER PARAM */
/* This is a number type, so there is no need
to specify buffer_length */
bind[0].buffer_type= MYSQL_TYPE_LONGLONG;
bind[0].buffer= (char *)&hash1;
bind[0].is_null= 0;
bind[0].length= 0;
bind[0].is_unsigned=1;

bind[1].buffer_type= MYSQL_TYPE_LONG;
bind[1].buffer= (char *)&article_id;
bind[1].is_null= 0;
bind[1].length= 0;
bind[1].is_unsigned=1;

/* Bind the buffers */
if (mysql_stmt_bind_param(stmt, bind))
{
fprintf(stderr, " mysql_stmt_bind_param() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}

/* Execute the INSERT statement - 1*/
if (mysql_stmt_execute(stmt))
{
fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}

Nhìn chung code vất vả hơn php gấp 10 lần :( .

Nhưng tốc độ thì khỏi nói .

Dự án của mình sau này chắc  có đển vài trăm ngàn bảng ghi , mà nó chạy như hack ấy :)) .

3.Complile :

gcc -o my.out -std=c99 $(mysql_config --cflags) mycode.c $(mysql_config --libs)

Có 2 tham số hơi lạ mysql_config --cflags <-- để chỉ ra đường dẫn tới mysql header

mysql_config --libs   <-- Để chỉ ra file lib của mysql ( sử dụng khi linking )

Các bạn có thể chạy lệnh này độc lập xem nó sinh ra cái gì .

Happy coding .

Bài viết tiếp theo sẽ là : Tự viến hàm mở rộng cho mysql ( tất nhiên là dùng C )

1 nhận xét: