Utilisation de paramètres avec une connexion Oracle ODBC
Question
Je me connecte avec succès à une base de données Oracle 10g avec un pilote Microsoft ODBC pour Oracle.
Les requêtes standard sans paramètres fonctionnent correctement, mais les requêtes paramétrées agissent comme si les paramètres n'étaient pas transmis.
ex.
--this works fine
Select * from tbl1 where column1 = 'test'
--this doesn't
select * from tbl1 where column1 = ?
--odbc string parameter 'test'
Voici à quoi ressemble ma chaîne de connexion:
"Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=" & pstrServer & ")(PORT=" & pintPort.ToString & "))" & _
"(CONNECT_DATA=(SERVICE_NAME=" & pstrPhysicalName & "))); " & _
"uid=" & pstrUserName & ";pwd=" & pstrPassword & ";"
Et j'ajoute des paramètres à ma commande ODBC comme ceci:
arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue)
...
cmd.Parameters.AddRange(arrOdbcParam)
Pardonnez le code partiellement pseudo-partiellement copié.
La solution
Un peu de nécromancie ici, mais comme je viens de me débattre avec un problème similaire, voici comment cela fonctionne avec le pilote ODBC pour 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();
Ceci effectue une recherche dans la "table". pour les enregistrements de la valeur 12345 dans " searchInt " et la date d'aujourd'hui dans "serachDat".
Choses à noter:
- Les paramètres sont marqués comme
?
dans le Commande SQL - Les paramètres n'ont pas besoin de nom, mais la position (et le type correct) sont important
Autres conseils
Les paramètres ODBC (marqués du symbole ?
) sont liés par la position. Vous devez donc vous assurer que vous ajoutez les OdbcParameter
dans le bon ordre. Leur nom est alors sans importance, mais je suggérerais paramName
, sans le @
qui est un format de nom spécifique à SQL Server (ou plutôt Microsoft).
Vous pouvez également essayer d'utiliser le format de paramètre Oracle, qui devrait être reconnu par le pilote Microsoft ODBC pour Oracle et vous autoriserait à effectuer une liaison par nom (mais pas à 100%, cependant):
- Remplacez
?
par: nomParam
dans votre requête. - Nommez votre paramètre
paramName
.
Essayez d’utiliser ": paramName " au lieu de "paramName".