2009-07-16 30 views
5

Tôi hiện đang làm việc trên một dự án ASP cổ điển nói chuyện với một cơ sở dữ liệu Oracle. Tôi đang cố gắng tìm một cách để gọi một kịch bản Oracle PL/SQL một cách an toàn và chuyển các tham số với ADO. Giải pháp hiện tại xây dựng kịch bản lệnh SQL bằng tay với các biến được nhúng như sau:Gọi một truy vấn Oracle tham số từ ADODB trong ASP cổ điển

strSQL = "SELECT field1, etc FROM my_table WHERE (field = '" & filter_value & "')" 

Điều này, tất nhiên, là xấu và không an toàn và mở để lạm dụng.

Mã mà tôi có cho đến nay (purloined từ asp cổ điển trang web dựa không khác nhau) trông như thế này:

dim strSQL, oConn, oCommand, oParam 
set oConn = server.createobject("ADODB.Connection") 
oConn.Open myConnString 

strSQL = "SELECT field1, etc FROM my_table WHERE (field = :filter_field)" 

dim oFilteredList 
set oFilteredList = Server.CreateObject("ADODB.Command") 
oFilteredList.ActiveConnection = oConn 
oFilteredList.CommandText = strSQL 
oFilteredList.CommandType = adCmdText 
oFilteredList.NamedParameters = True 

set oParam = oFilteredList.CreateParameter("filter_field", adVarChar, adParamInput, 10, filter_value) 
oFilteredList.Parameters.Append oParam 

set rsResults = oFilteredList.Execute 

này gây ra lỗi “Parameter đối tượng được không đúng quy định. Thông tin không nhất quán hoặc không đầy đủ được cung cấp ”

Phương pháp gọi Oracle/PL/SQL đúng với các tham số được đặt tên từ ADO là gì? Tôi cần phải sử dụng các tham số được đặt tên vì mã SQL thực tế có phần phức tạp hơn và các tham số khác nhau được sử dụng nhiều lần trong suốt lệnh SQL.

+0

Hãy thử nhận xét dòng với NamedParameters = Đúng và xem điều đó có hữu ích không. – shahkalpesh

+0

bạn đang sử dụng Tùy chọn Rõ ràng và bạn đã bao gồm một số loại tệp adovbs.inc cho các hằng số "quảng cáo" của mình chưa? – Funka

+0

Vâng, tôi đã thử cả hai có và không có thuộc tính NamedParameters, và tôi bao gồm adovbs.inc. Tôi luôn sử dụng tùy chọn rõ ràng – Buzzrick

Trả lời

2

Bạn có filter_value được xác định như thế nào? Nếu nó không được khai báo là một String hoặc nếu bạn đã gán một chuỗi dài hơn 10 ký tự (như bạn đã chỉ ra khi tạo tham số), bạn sẽ có vấn đề với chuỗi đó.

Thêm vào đó (và một phần để tham khảo của riêng tôi), tên thông số không được hỗ trợ thông qua OraOLEDB (ví dụ: ADODB).

Xem Oracle® Provider for OLE DB Developer's Guide 11g Release 1 (11.1) hoặc làm theo các "Command thông số" nhóm liên kết trên bất kỳ previous versions (8iR3, 9i, 9iR2, 10g, 10gR2):

lệnh thông số

Khi sử dụng Oracle ANSI SQL, tham số trong văn bản lệnh được bắt đầu bằng dấu hai chấm . Trong ODBC SQL, các tham số là được biểu thị bằng dấu chấm hỏi (?).

OraOLEDB hỗ trợ đầu vào, đầu ra và tham số đầu vào và đầu ra cho PL/SQL các thủ tục được lưu trữ và được lưu trữ chức năng. OraOLEDB hỗ trợ các tham số đầu vào cho các câu lệnh SQL.

"Lưu ý: OraOLEDB chỉ hỗ trợ ràng buộc vị trí".

Điều đó nói rằng, điều này sẽ không có mang về truy vấn của bạn khi sử dụng OraOLEDB:

oFilteredList.NamedParameters = True 

Tôi đã thành công chạy các truy vấn chính xác như phần còn lại của các ví dụ của bạn hiển thị mặc dù trên Oracle 10gR2.

Bạn không hiển thị chuỗi kết nối của mình, vì vậy tôi phải cho rằng nó hợp lệ. Hành vi có thể khác nhau tùy thuộc vào các tùy chọn ở đó, vì vậy, đây là những gì tôi đã sử dụng thành công:

`"Provider=OraOLEDB.Oracle;Data Source=TNSNAMES_ENTRY;User ID=XXXX;Password=YYYY;DistribTx=0;"` 
Các vấn đề liên quan