2009-01-05 63 views
6

bạn thích phương pháp nào để tạo truy vấn sql động? định dạng hoặc phát trực tuyến? Có phải nó chỉ là sở thích hay có lý do nào tốt hơn so với khác hay bất kỳ thư viện đặc biệt nào bạn sử dụng.tạo truy vấn sql trong C++/java?

EDIT: Vui lòng trả lời trong trường hợp C++.

Trả lời

4

Trong Java, bạn nên sử dụng PreparedStatement.

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?"); 
statement.setInt(1, 17); 
ResultSet resultSet = statement.executeQuery(); 
+0

cảm ơn, cách ngăn chặn trong C++? – yesraaj

+0

Không có ý tưởng, C + + không phải là tách trà của tôi. :) – Bombe

6

Luôn sử dụng "chuẩn bị" sẽ tương đương với standardStatement nhưng tên hàm chính xác sẽ phụ thuộc vào kết hợp cơ sở dữ liệu và trình điều khiển của bạn.

Những lợi thế của một tuyên bố chuẩn bị trên một thực (String) rất nhiều: -

Tuyên bố được phân tách và một kế hoạch truy cập determind chỉ một lần khi "chuẩn bị" tuyên bố được thực thi. Tùy thuộc vào số lần bạn chạy câu lệnh này có thể dẫn đến hiệu suất tốt hơn nhiều.

Bạn không cần phải lo lắng về các ký tự đặc biệt trong dữ liệu chuỗi khi bạn chuyển nó qua setString(). Trong một thực thi (String) bất kỳ dấu nháy đơn hoặc dấu chấm phẩy nào trong dữ liệu sẽ dẫn đến lỗi phân tích cú pháp.

Tệ hơn nữa là cách hoạt động của "tấn công sql injection". Nếu một chuỗi giống như "x" từ cust_table ; xóa khỏi lệnh _ bảng ; chọn "được nhập dưới dạng dữ liệu mà nó có thể dẫn đến lệnh xóa được phân tích cú pháp và thực hiện.

Xử lý các số hiệu quả hơn nhiều. Một cuộc gọi setInt lấy một giá trị số nguyên như là đối với chuỗi SQL equvalent mà bạn phải chuyển đổi thành các ký tự thì DBMS phải chuyển đổi nó trở về một số nguyên.

Dễ đọc. Bạn viết mã một câu lệnh SQL với một vài dấu hỏi, trong đó các biến đi tương đối dễ đọc, trái ngược với phân tích cú pháp về tinh thần và phân tích một chuỗi các sự kết hợp chuỗi sẽ gây thêm tiếng ồn cho các dấu ngoặc kép đã thoát ...

Tuy nhiên, vài trường hợp thực thi (String) thực sự tốt hơn.

Trường hợp khóa của bạn được phân phối rất không đồng đều. VÍ DỤ. Nếu 95% khách hàng của bạn sống ở Hoa Kỳ và bạn muốn liệt kê 4% người sống ở Canada thì "nơi quốc gia =?" thường sẽ dẫn đến việc quét không gian bảng trong khi với "where country = 'CA'" bạn có một số cơ hội sử dụng chỉ mục.

Trường hợp còn lại là nơi người dùng có thể nhập hoặc bỏ qua một số tiêu chí tìm kiếm. Tốt hơn hết là xây dựng một chuỗi SQL cho các tiêu chí mà bạn đã đưa ra hơn là xây dựng một truy vấn phức tạp mà đối phó với tất cả các hoán vị có thể có của các tiêu chí đầu vào.

1

Khi sử dụng chuẩn bị phát biểu là không thể, tôi tìm cách sử dụng dòng C++ là cách tốt nhất để viết các truy vấn:

std::ostringstream sql; 
sql << "exec loadStuff(" << param1 << ", " << param2 << ")"; 

Không cần phải lo lắng về các loại của các thông số và độ dài của chuỗi là tuyệt vời!

+0

Tôi ngần ngại bỏ phiếu, nhưng tôi lo ngại về mối đe dọa của các cuộc tấn công SQL injection trong kỹ thuật đó. :( –

+1

Đủ công bằng, nhưng khi sử dụng một thư viện không có các câu lệnh chuẩn bị, trong một ứng dụng nội bộ chủ yếu xử lý các số, tôi thấy mẫu này hữu ích và hiệu quả để gọi các thủ tục lưu sẵn. –

+0

Xin lỗi, small_duck Tôi không nắm bắt được câu trả lời "Khi sử dụng câu trả lời đã chuẩn bị", tôi sẽ hủy bỏ bỏ phiếu của tôi, nhưng nó cho rằng phiếu bầu của tôi quá cũ để đảo ngược. nếu bạn chỉnh sửa câu trả lời của bạn, tôi có thể thu hồi câu trả lời đó. Có lẽ bạn có thể in đậm phần "không thể" để giúp những người có khuyết điểm tương tự như tôi. :) –