Utilizzo dei parametri con una connessione ODBC Oracle
Domanda
Mi collego con successo a un Oracle 10g DB con un driver Microsoft ODBC per Oracle.
Le query regolari senza parametri funzionano correttamente, ma le query con parametri funzionano come se i parametri non venissero passati.
es.
--this works fine
Select * from tbl1 where column1 = 'test'
--this doesn't
select * from tbl1 where column1 = ?
--odbc string parameter 'test'
Ecco come appare la mia stringa di connessione:
"Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=" & pstrServer & ")(PORT=" & pintPort.ToString & "))" & _
"(CONNECT_DATA=(SERVICE_NAME=" & pstrPhysicalName & "))); " & _
"uid=" & pstrUserName & ";pwd=" & pstrPassword & ";"
E sto aggiungendo parametri al mio comando ODBC in questo modo:
arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue)
...
cmd.Parameters.AddRange(arrOdbcParam)
Perdona il codice parzialmente copiato, in qualche modo pseuedo.
Soluzione
Un po 'di necromance qui, ma poiché ho appena lottato con un problema simile, ecco come ha funzionato con il driver ODBC per Centura SQLBase:
OdbcCommand com = con.CreateCommand();
com.CommandText = @"
SELECT thing
FROM table
WHERE searchInt = ? AND searchDat = ?";
com.Parameters.Add(new OdbcParameter("", OdbcType.Int)).Value = 12345;
com.Parameters.Add(new OdbcParameter("", OdbcType.DateTime)).Value = DateTime.Now;
OdbcDataReader reader = com.ExecuteReader();
Cerca in " tabella " per i record con il valore 12345 in " searchInt " e la data odierna in "serachDat".
Cose da notare:
- I parametri sono contrassegnati come
?
in Comando SQL - I parametri non hanno bisogno di un nome, ma position (e il tipo corretto) sono importante
Altri suggerimenti
I parametri ODBC (contrassegnati dal simbolo ?
) sono vincolati dalla posizione, quindi è necessario assicurarsi di aggiungere OdbcParameter
nell'ordine corretto. Il loro nome non è quindi importante, ma suggerirei paramName
, senza @
che è un formato di nome specifico di SQL Server (o, piuttosto, Microsoft).
Potresti anche provare a utilizzare il formato dei parametri Oracle, che dovrebbe essere riconosciuto dal driver Microsoft ODBC per Oracle e ti permetterebbe invece di legare per nome (non sicuro al 100% su questo, però):
- Sostituisci
?
con: paramName
nella tua query. - Assegna un nome al tuo parametro
paramName
.
Prova a utilizzare ": paramName " invece di " paramName " ;.