tin tức

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

22/02/2012 - Xem: 879

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

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 )


(i-php.net)

Liên kết

Tin được quan tâm nhất

Quản cáo