2009-02-24 40 views
9

Tôi đang viết một số mã C++ sử dụng thư viện sqlite3. Tôi đang sử dụng một tuyên bố chuẩn bị mà tôi ràng buộc một biến tại thời gian chạy.câu lệnh chuẩn bị sqlite - cách gỡ lỗi

Làm cách nào để kiểm tra truy vấn SQL trong tuyên bố sau khi kết buộc?

Ví dụ: mã bên dưới không trả về hàng. Khi sử dụng chuỗi premade và sqlite3_exec, tôi nhận được kết quả mong đợi.

sqlite3_stmt *statement; 
const char *query = "SELECT * FROM foo WHERE (name='?');"; 
sqlite3_prepare_v2(db, query, strlen(query), &statemtnt, NULL); 
sqlite3_bind_text(statement, 1, "bar", -1, SQLITE3_STATIC); 
int result = sqlite3_step(statement); 
// expected: result = SQLITE_ROW 
// actual: result = SQLITE_DONE 

chỉnh sửa: Như Ferdinand đã nêu bên dưới, sự cố trong truy vấn ở trên là dấu ngoặc kép xung quanh?. Tuy nhiên, trong tương lai, tôi vẫn muốn biết cách kiểm tra sqlite3_stmt cho truy vấn thực tế sẽ được thực thi.

Trả lời

1

Tham số thứ ba của sqlite3_bind_text được coi là giá trị bạn muốn ràng buộc - trong mã của bạn mà bạn đang cố gắng ràng buộc truy vấn với chính nó!

Ngoài ra, mất dấu chấm phẩy ở cuối SELECT.

+0

Xin lỗi, có một lỗi đánh máy khi viết câu hỏi. Vì vậy, không, đó không phải là vấn đề thực sự, xin lỗi –

+0

Tôi tin rằng dấu chấm phẩy được yêu cầu –

6

Truy vấn SQL không thay đổi sau các ràng buộc - các biến của bạn không được chèn vào chuỗi SQL hoặc bất kỳ thứ gì.

Ngoài những gì Neil nói, hãy thả dấu ngoặc kép xung quanh? trình giữ chỗ:

"SELECT * FROM foo WHERE name = ?" 

Nếu không, SQLite sẽ không thay thế dấu hỏi nhưng sẽ coi nó là chuỗi "?".

+1

Cảm ơn, vấn đề thực sự là dấu ngoặc kép xung quanh? –

+0

Tôi biết chuỗi sql không thay đổi (tôi đã tuyên bố nó const, sau khi tất cả). NHƯNG, câu lệnh thay đổi. Có cách nào để xem những gì truy vấn sẽ đi đến DB sau khi các ràng buộc bằng cách nhìn vào tuyên bố? –

+0

Bạn có nghĩa là bạn muốn kiểm tra cây phân tích được tạo bởi SQLite? Tôi không nghĩ rằng bạn có thể làm điều đó mà không cần đào sâu vào mã nguồn SQLite ... –

-1

Không biết sqlite tất cả tốt, nhưng truy vấn thực tế có thể được đăng nhập hoặc bạn có thể lật công tắc để làm cho nó được ghi nhật ký.

1

Vâng, bạn có thể làm điều đó bằng cách định nghĩa một hàm hồ sơ như thế này:

static void profile(void *context, const char *sql, sqlite3_uint64 ns) { 
fprintf(stderr, "Query: %s\n", sql); 
fprintf(stderr, "Execution Time: %llu ms\n", ns/1000000);} 

Sau đó, ngay sau khi bạn mở cơ sở dữ liệu bằng cách sử dụng sqlite3_open, thực hiện cuộc gọi này:

sqlite3_profile(fDBLink, &profile, NULL); 
+0

Tôi vừa thử điều này; nó không hiển thị kết quả của các ràng buộc như op dường như mong muốn. – kasterma

+0

Đề xuất tốt nhưng không hiển thị đối số được ràng buộc – inversus

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