Uso de parámetros con una conexión ODBC de Oracle
Pregunta
Me estoy conectando con éxito a un Oracle 10g DB con un controlador ODBC de Microsoft para Oracle.
Las consultas regulares sin parámetros funcionan bien, pero las consultas parametrizadas actúan como si no se pasaran los parámetros.
ej.
--this works fine
Select * from tbl1 where column1 = 'test'
--this doesn't
select * from tbl1 where column1 = ?
--odbc string parameter 'test'
Así es como se ve mi cadena de conexión:
"Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=" & pstrServer & ")(PORT=" & pintPort.ToString & "))" & _
"(CONNECT_DATA=(SERVICE_NAME=" & pstrPhysicalName & "))); " & _
"uid=" & pstrUserName & ";pwd=" & pstrPassword & ";"
Y estoy agregando parámetros a mi comando ODBC como este:
arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue)
...
cmd.Parameters.AddRange(arrOdbcParam)
Perdona el código parcialmente copiado, algo pseuedo.
Solución
Un poco de nigromancia aquí, pero como acabo de lidiar con un problema similar, aquí es cómo funcionó con el controlador ODBC para 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();
Esto busca en la tabla " " para registros con el valor 12345 en " searchInt " y la fecha de hoy en '' serachDat ''.
Cosas a tener en cuenta:
- Los parámetros están marcados como
?
en el Comando SQL - Los parámetros no necesitan nombre, Pero la posición (y el tipo correcto) son importante
Otros consejos
parámetros ODBC (marcados por el símbolo ?
) están vinculados por la posición, por lo que debe asegurarse de agregar los OdbcParameter
en el orden correcto. Su nombre no es importante, pero sugeriría paramName
, sin el @
que es un formato de nombre específico de SQL Server (o, más bien, de Microsoft).
También puede intentar usar el formato de parámetro de Oracle, que debe ser reconocido por el controlador ODBC de Microsoft para Oracle y le permitiría vincularlo por su nombre (aunque no estoy 100% seguro de esto):
- ¿Reemplazar
?
por: paramName
en su consulta. - Nombre su parámetro
paramName
.
Prueba a usar ": paramName " en lugar de " paramName " ;.