2012-03-29 21 views
17

Tôi thường phát triển với một máy chủ trực tiếp, nhưng lần đầu tiên tôi nghĩ mình sẽ thực hiện bước nhảy vọt và xem liệu tôi có thể nhận được tất cả mã mysql (C++) của tôi hoạt động như một máy chủ nhúng hay không. Đặc biệt, tôi rất thích các phát biểu chuẩn bị như họ (IMHO) "nói chung" vượt trội so với giống không chuẩn bị.Các câu lệnh chuẩn bị được hỗ trợ trong MySQL nhúng

Tôi đã thử sử dụng libmysqld từ 5.5.22 và libmysqld từ 5.6.4 và không hoạt động.

Kết nối được thực hiện, các lệnh mysql_query/mysql_real_query đơn giản hoạt động tốt, nhưng ngay sau khi câu lệnh được chuẩn bị đầu tiên của tôi phát ra một mysql_stmt_fetch(), tôi nhận được các lệnh 'ghét' không đồng bộ '.

Sự cố tương tự xuất hiện trên diễn đàn oracles (http://forums.mysql.com/read.php?168,507863,507863#msg-507863) mà không có độ phân giải.

Tôi không thấy, cũng không tin rằng tôi thiếu bất kỳ lệnh nào giữa mysql_real_connect() và mysql_stmt_fetch().

Tất cả các tìm kiếm của tôi đều trống cho bất kỳ ví dụ nào của máy chủ nhúng đang sử dụng câu lệnh đã chuẩn bị. Tôi cũng không tìm thấy một câu thực sự "bạn không thể làm điều này".

Vì vậy ... có hoặc không được hỗ trợ không?

Cảm ơn sự thông cảm của bạn.

// chỉnh sửa để làm sáng tỏ hơn nữa này (và hướng dẫn nếu cần thiết) đầy đủ chuỗi mysql cmd của tôi là như sau:

mysql_library_init(); // as embedded 
mysql_init(); 
mysql_options(MYSQL_SET_CHARSET_NAME); //to utf8 
mysql_options(MYSQL_OPT_USE_EMBEDDED_CONNECTION); 
mysql_real_connect(); 
mysql_real_query("SET NAMES 'utf8'"); 
mysql_real_query("SET CHARACTER SET 'utf8'"); 
mysql_set_character_set("utf8"); // yes, you really do need to set utf8 four times 
mysql_autocommit(mAutocommit); 

vào thời điểm này, mysql_real_query() cuộc gọi DO làm việc. Tôi tiếp tục ...

//all this would only happen once for each stmt 
{ 
    mysql_stmt_init(); 
    mysql_stmt_prepare(theQuery); 
    mysql_stmt_param_count(); // to assert input bind object (aka the predicates) has the same number of params as theQuery 
    mysql_stmt_result_metadata() 
    mysql_num_fields(); // to assert the output bind object has the same number of params as theQuery 
    mysql_free_result(metadata); 
    mysql_stmt_bind_param(); // called IF there are input params 
    mysql_stmt_bind_result(); // pretty much always called for the output params 
} 
// and at last 
mysql_stmt_execute(); 
//mysql_stmt_store_result(); //{OPTIONAL: use if you want to buffer the fetch - I dont} 
mysql_stmt_fetch(); // ERROR! commands out of sync. 

// and for completeness, 
mysql_stmt_free_result(); 
mysql_stmt_close(); 

// and the shutdown 
mysql_close(); 
mysql_library_end(); 

Trả lời

3

Tôi đã sợ điều này .. nhưng sau khi không có số lượng công việc nhỏ, tôi có một câu trả lời cho câu hỏi của tôi, và một giải pháp cho vấn đề. (vâng tôi là một người lập trình lười biếng ... tôi hy vọng một người nào khác sẽ nói với tôi tất cả những điều này là cần thiết..hehe)

Đây là câu trả lời có thẩm quyền của riêng tôi cho máy chủ nhúng + câu lệnh chuẩn bị không có câu hỏi.

câu hỏi: các khung được hỗ trợ trong nhúng? câu trả lời ... họ nên nhưng họ KHÔNG.

Có, có lỗi trong mysql được nhúng đối với các stmts. Xem: http://bugs.mysql.com/bug.php?id=62136

Ông Qi Zhou có tất cả sự tôn trọng của tôi. Ông bằng cách nào đó xác định rằng khi chạy nhúng, mysql_stmt_execute() đã được thiết lập không đúng tình trạng kết quả để "MYSQL_STATUS_GET_RESULT" thay vì "MYSQL_STATUS_STATEMENT_GET_RESULT" (tức là xử lý một stmt như một không statment) Điều này rõ ràng WOULD tự nhiên dẫn đến một "lệnh ra khỏi đồng bộ" lỗi. Vì vậy, nó đòi hỏi phải vá mã nguồn chính nó.

Làm thế nào để làm điều đó .. Các MySql "làm thế nào để xây dựng trên cửa sổ" trang ở đây: http://dev.mysql.com/doc/refman/5.5/en/source-installation.html

tài liệu tham khảo

này dễ dàng hơn để đọc nhiều, HƯỚNG DẪN-BUILD: http://www.chriscalender.com/?p=689

Ghi chú CÁCH THÊM bổ sung mà tôi đã xác định trong quá trình

Cách làm của Chris dành cho VS2008 express. Tôi sử dụng 2010 Pro và học được cmake -G arg có thể được bỏ qua. Đối với tôi, 2010 được tự động xác định là trình biên dịch để sử dụng.

Tôi chỉ cài đặt cmake và bò rừng. perl và bazaar là không cần thiết cho việc này. và tôi có bản phân phối nguồn chuẩn 5.5.22 thay vì kéo từ chợ.

lại: cài đặt bò rừng:

  • hãy chắc chắn để cài đặt bò rừng để một con đường mà không có dấu
  • KHÔNG cho phép cài đặt thêm bất cứ điều gì vào menu start (gây ra "m4.exe không tìm thấy" lỗi)
  • tự thêm thư mục bin bò rừng để PATH hệ thống

lại: signtool.exe

đảm bảo đường dẫn đến signtool được thêm vào PATH. Ví dụ (đối với tôi)

  • c: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin

Tải distro nguồn MySql (http://dev.mysql.com/downloads/mysql/#downloads): Generic Linux (Kiến trúc độc lập) , nén TAR Lưu Trữ (mysql-5.5.22.tar.gz)

bạn cần phải chỉnh sửa {D: \ your_path} \ mysql-5.5.22 \ libmysqld \ lib_sql.cc

On line 340 bạn sẽ xem:

if (res) 
{ 
    NET *net= &stmt->mysql->net; 
    set_stmt_errmsg(stmt, net); 
    DBUG_RETURN(1); 
} 
//ADD CODE HERE 
DBUG_RETURN(0); 

Chèn giữa nếu codeblock và DBUG_RETURN (0) như sau:

//kgk 2012/04/11 - see http://bugs.mysql.com/bug.php?id=62136 
// Qi Zhou's modification to allow prep'd stmts to work 
else if (stmt->mysql->status == MYSQL_STATUS_GET_RESULT) 
{ 
    stmt->mysql->status= MYSQL_STATUS_STATEMENT_GET_RESULT; 
} 

Và xây dựng cho mình một phiên bản phát hành mới của libmysqld.dll, libmysqld.lib, libmysqld.pdb

và vấn đề đã được sửa.

Khi bạn đã xây dựng dll, đừng làm như tôi và quên di chuyển DLL mới vào thư mục thời gian chạy nhị phân của bạn và ngồi đó tự hỏi tại sao thay đổi không làm gì cả. Thở dài.

FYI: báo cáo lỗi của techie oracle được gắn thẻ với [20 Feb 18:34] Sveta Smirnova hoàn toàn vô nghĩa. serverARgs không liên quan gì cả.

-2

MySQL được nhúng thường không được sử dụng và cho vấn đề này tôi đã tìm kiếm trên web nhiều lần và tôi đã chuẩn bị một dự án riêng biệt. Trong khi làm như vậy, tôi đã học được nhiều điều và một trong những điều là đầu tiên thực hiện truy vấn và sau đó lưu trữ các kết quả.

Để loại bỏ các loại truy vấn khác nhau, vui lòng tạo một đối tượng để thực hiện và trả lại kết quả và trong trường hợp này bạn không phải viết truy vấn thực thi lặp đi lặp lại.

Trong trường hợp hiện tại, người dùng không thực hiện truy vấn và cố gắng lưu trữ kết quả và điều này chỉ xảy ra khi bạn cố gắng sao chép các lệnh khác. Do đó, giải pháp cho vấn đề là để thực hiện mysql_stmt_execute và sau đó gọi mysql_stmt_store_result

+1

Cảm ơn sự giúp đỡ của bạn. Câu hỏi của tôi không dựa trên giá trị của các câu lệnh đã chuẩn bị mà dựa trên thông tin liên quan đến việc chúng có hoạt động với thư viện mysql được nhúng (tức là không có máy chủ bên ngoài) hay không. Đối với tôi, họ KHÔNG làm việc. thứ hai, gọi mysql_stmt_store_result không liên quan. Để bạn tham khảo, hãy xem: http://dev.mysql.com/doc/refman/5.5/en/mysql-stmt-store-result.html nếu bạn không đệm tìm nạp (mà tôi KHÔNG), thì bạn KHÔNG cần phải gọi cửa hàng (mà tôi không). Không có gì-ít, chỉ để xem, tôi đã thử đề xuất của bạn và không đồng bộ xảy ra tại lệnh cửa hàng. –

-1

http://dev.mysql.com/doc/refman/5.1/en/mysql-stmt-execute.html

xin lỗi vì tiếng xấu của tôi, nhưng vấn đề là mysql_stmt_fetch mở con trỏ, nhưng mysql_stmt_execute chỉ thực hiện công việc mysql_stmt_store_result với con trỏ ...

+0

đường dẫn mã của tôi là như trên, mysql_stmt_execute() theo sau là mysql_stmt_fetch(). Điều này là hoàn toàn thực hiện "stmt" mã khi kết nối với một máy chủ mysql từ xa. Tuy nhiên, nó tạo ra lỗi 'không đồng bộ' khi được áp dụng cho máy chủ được nhúng. vì vậy .. câu trả lời của bạn không liên quan. –