2013-01-19 34 views
5

Tôi đang sử dụng Trình kết nối MySQL/C++ để liên lạc với máy chủ MySQL từ chương trình C++. Đối với một số lý do (xem dưới đây cho nền), tôi cần tại một số điểm cấu trúc kết nối C API gốc. Làm cách nào để lấy nó từ các lớp Connector/C++?Làm cách nào để có cấu trúc kết nối C API gốc từ Trình kết nối MySQL/C++?

Bối cảnh:

Tôi muốn tải một lượng lớn dữ liệu (lên đến 2-3 tỷ tuples) từ bộ nhớ chính của khách hàng vào máy chủ. Vì vậy, tôi muốn thử câu lệnh LOAD DATA INFILE. Để tránh ghi toàn bộ dữ liệu vào một tệp văn bản trước, tôi muốn định nghĩa trình xử lý infile cục bộ của riêng tôi, nó đọc dữ liệu trực tiếp từ bộ nhớ chính.

Tuy nhiên, Trình kết nối/C++ không có phương pháp để đặt trình xử lý tệp nội bộ do người dùng xác định, nhưng API C gốc có. Hàm C tương ứng mysql_set_local_infile_handler() cần một trình xử lý kết nối nguyên gốc (cấu trúc MYSQL) làm tham số đầu vào. Vậy làm thế nào để có được trình xử lý này từ Connector/C++? Hoặc là có cách nào tốt hơn để thiết lập xử lý infile địa phương trong một môi trường Connector/C++?

+0

Nó chắc chắn được xây dựng trên Connector/C. Connector/C++ chỉ là một trình bao bọc bổ sung xung quanh C API gốc (Native C API và Connector/C là hai từ cho cùng một điều, nhân tiện). Nó được đề cập nhiều lần trong sách hướng dẫn, ví dụ ở đây: "Trình kết nối MySQL/C++ dựa trên Thư viện Máy khách MySQL (API MySQL C)." (http://dev.mysql.com/doc/refman/5.5/en/connector-cpp-installation-source.html) (Nhận xét ở đâu tôi trả lời !?) – user1494080

Trả lời

2

Bạn muốn sql::mysql::NativeAPI::MySQL_NativeConnectionWrapper::mysql, nhưng đó là thành viên riêng tư không được trả về bằng bất kỳ phương pháp nào. Vì vậy, để truy cập vào cấu trúc, bạn sẽ phải chia rẽ nguồn Connector/C++ và biên dịch trình kết nối của riêng bạn.

Nếu đó là đường dẫn bạn thực hiện, bạn có thể muốn cấp quyền truy cập vào mysql_set_local_infile_handler() từ trong Trình kết nối/C++.

+0

Quá tệ. Tôi hy vọng điều này sẽ có thể với "vani" kết nối. – user1494080

0

Có một cách khác để làm việc đó xung quanh thông qua sự trợ giúp của lệnh C++ "hệ thống".

1) đặt môi trường mysql trong my.cnf: local-infile=1. Bạn có thể tìm thấy tệp này tại đây: how to know mysql my.cnf location. Hoặc chỉ cần thêm tùy chọn mysql --local-infile [other options] vào dòng lệnh trình bao được đề cập bên dưới.

2) Trong C++ mã của bạn, thay vì sử dụng stmt->execute(...) từ C++ kết nối, sử dụng

system("mysql -u username --database=dbname --password=pw -e \"LOAD DATA LOCAL INFILE filename INTO TABLE tablename FIELD TERMINATED BY ',' LINES TERMINATED BY '\n' (column1, column2, column3);\"");

Mảng char cũng có thể được thao tác trong chương trình. Mặc dù nó có vẻ "công nghệ thấp", nhưng nó hoàn thành công việc trong dự án của tôi.

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