2009-07-28 27 views
6

Tôi đang bối rối khi cố gắng tìm nạp các hàng trong bảng mysql bằng cách sử dụng C++ với API MySQL C.Tìm nạp các hàng trong bảng cơ sở dữ liệu MySQL bằng cách sử dụng MySQL C API và C++

tôi có thể làm điều đó một cách dễ dàng trong PHP, chỉ vì C++ là một ngôn ngữ mạnh mẽ, đánh máy để chúng ta cũng cần phải chăm sóc quá trình bẩn ..

này là làm thế nào tôi thực hiện nó trong PHP

$data = array(); 
$i = 0; 
$query = mysql_query("SELECT * FROM `my_table`"); 
while($fetch = mysql_fetch_array($query)) 
{ 
    $data[$i] = $fetch['columntobefetched']; 
    $i++; 
}

Nhưng cách thực hiện tương tự trong C++ bằng API MySQL?

Dưới đây là mã của tôi cho đến nay .... với một kết thúc chết khó hiểu ... x__x

 MYSQL *sqlhnd = mysql_init(NULL); 
    mysql_real_connect(sqlhnd, "server", "user", "pass", "database", port, NULL, 0); 

    mysql_query(sqlhnd, "SELECT * FROM `my_table`"); 
    MYSQL_RES *confres = mysql_store_result(sqlhnd); 
    int totalrows = mysql_num_rows(confres); 
    int numfields = mysql_num_fields(confres); 
    MYSQL_FIELD *mfield; 

    while((row = mysql_fetch_row(confres))) 
    { 
     for(i = 0; i < numfields; i++) 
     { 
      while(mfield = mysql_fetch_field(confres)) 
      { 
       mfield->//??? I'm dead 
      } 
     } 
    }

Về cơ bản tôi muốn để có được một giá trị từ một lĩnh vực trong bảng cơ sở dữ liệu và lưu trữ nó vào một biến.

. Bất kỳ loại trợ giúp sẽ được đánh giá cao :)

Cảm ơn

Trả lời

13

trong API MySQL C, mysql_fetch_row trả về một đối tượng MYSQL_ROW, trong đó chủ yếu là ar tia giá trị trong hàng hiện tại.

Vì vậy, mã của bạn nên có cái gì đó như:

mysql_query(sqlhnd, "SELECT * FROM `my_table`"); 
MYSQL_RES *confres = mysql_store_result(sqlhnd); 
int totalrows = mysql_num_rows(confres); 
int numfields = mysql_num_fields(confres); 
MYSQL_FIELD *mfield; 

while((row = mysql_fetch_row(confres))) 
{ 
    for(i = 0; i < numfields; i++) 
    { 
     char *val = row[i]; 
     // do something with val... 
    } 
} 

Hơn thế nữa, đừng làm một "SELECT * FROM mytable" trong một chương trình. Sẽ tốt hơn nếu bạn đặt tên cho các trường mà bạn mong đợi, để bạn có thể chắc chắn thứ tự của các trường được trả về.

+0

Thanks a lot^______^nó giải quyết vấn đề của tôi –

+0

gì chữ viết tắt "conf" đứng cho trong tên biến của bạn? –

+3

Điều này sẽ làm rò rỉ bộ nhớ. "Bạn cũng phải gọi mysql_free_result() sau khi bạn đã xong với tập kết quả." https://dev.mysql.com/doc/refman/5.7/en/mysql-store-result.html Xem thêm https://dev.mysql.com/doc/refman/5.7/en/c-api-function -overview.html –

4

Nếu bạn đang sử dụng C++ tại sao không sử dụng MySQL++? Đây là một số mẫu mã:

mysqlpp::Connection dbconnection; 
dbconnection.connect("database", "server", "user", "pass"); 

mysqlpp::Query prepared_query = dbconnection.query("SELECT * FROM `my_table`"); 

mysqlpp::StoreQueryResult r = prepared_query.store(); 

int field = r.field_num("columntobefetched"); 

for(mysqlpp::StoreQueryResult::iterator i = r.begin(); i!=r.end();i++) 
{ 
     std::cout << i->at(field) << std::endl; 
     std::cout << (*i)["columntobefetched"] << std::endl; // this will be slower 
} 
+2

Ngoài ra (theo mặc định) mã kết nối C++ ném ngoại lệ nếu có lỗi. Vì mã ví dụ C của bạn không có bất kỳ lỗi xử lý _at all_ nào, bạn có thể quan tâm đến tính năng đó. – VolkerK

+0

Tôi sẽ thử dùng MySQL ++ sớm. Cảm ơn đề xuất –

+0

Nit: bạn cần dấu ngoặc kép xung quanh "columntobefetched" –

Các vấn đề liên quan