2009-07-16 31 views
5

'da ADODB'den parametrelenmiş bir Oracle sorgusunu çağırın. Şu anda bir Oracle veritabanını konuşurken klasik bir ASP projesi üzerinde çalışıyorum. Oracle PL/SQL komut dosyasını güvenli bir şekilde aramak ve parametreleri ADO ile iletmek için bir yol bulmaya çalışıyorum. Şu anda çözüm böyle gömülü değişkenlerle elle SQL komut dosyası oluşturur:Klasik ASP

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

Bu, elbette, çirkin ve güvensiz ve istismara açıktır.

şimdiye kadar (çeşitli olmayan klasik asp tabanlı web sitelerinden purloined) sahip kod şöyle görünür:

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 

Bu hata “Parametre nesnesi hatalı tanımlanır neden olur. Tutarsız veya eksik bilgi verildi ”

ADO'dan adlandırılmış parametrelerle Oracle/PL/SQL'i doğru arama yöntemi nedir? Adlandırılmış SQL kodu biraz daha karmaşık olduğundan ve SQL komutu boyunca farklı parametreler birden çok kez kullanıldığı için adlandırılmış parametreleri kullanmam gerekiyor.

+0

NamedParameters = Doğru çizgiyi yorum deneyin ve görmek eğer yardımcı olur. – shahkalpesh

+0

, Option Explicit kullanıyor ve "ad" sabitleriniz için bir çeşit adovbs.inc dosyasını eklediniz mi? – Funka

+0

Evet, hem NamedParameters özelliği ile hem de olmadan denedim ve adovbs.inc dahil ediyorum. Ben her zaman seçeneği açık kullanırım – Buzzrick

cevap

2

filter_value nasıl tanımlanır? Dize olarak bildirilmemişse veya 10 karakterden uzun bir dize atadıysanız (parametreyi oluştururken belirttiğiniz gibi), bununla ilgili sorunlarınız olacaktır.

Ayrıca (ve kısmen kendi referans için), adlı parametreler OraOLEDB (yani ADODB) üzerinden desteklenmez.

Oracle® Provider for OLE DB Developer's Guide 11g Release 1 (11.1) Bkz veya previous versions (8iR3, 9i, 9iR2, 10g, 10gR2) herhangi "Komut Parametreleri" başlığı bağlantıyı izleyin:

Oracle ANSI kullanırken

Komut Parametreleri SQL, komut metnindeki parametreleri kolonundan önce gelir. ODBC SQL'de, bir soru işareti (?) Ile belirtilen parametreleridir. PL/SQL saklı prosedürler ve saklanan fonksiyonları için

OraOLEDB girişi, çıkışı destekler

ve giriş ve çıkış parametreleri. OraOLEDB, SQL ifadeleri için girişini destekler.

"Not: OraOLEDB sadece pozisyonel bağlama destekler." OraOLEDB kullanırken bahsedilen

, bu sorguda üzerinde hiçbir etkiye sahip olmalıdır: Ben başarı sorguları çalışan yaşadım

oFilteredList.NamedParameters = True 

sizin örnek kalanı Oracle 10gR2 üzerinde olsa gösterir tam olarak.

Bağlantı dizginizi göstermiyorsunuz, dolayısıyla geçerli olduğunu varsaymalıyım. Davranış işte başarıyla kullandığım şey, orada seçeneklere bağlı olarak farklılık gösterebilir:

`"Provider=OraOLEDB.Oracle;Data Source=TNSNAMES_ENTRY;User ID=XXXX;Password=YYYY;DistribTx=0;"`