Usando parâmetros com uma conexão ODBC para Oracle
Pergunta
Eu estou conectando com sucesso a um Oracle 10g DB com um ODBC da Microsoft para Oracle motorista.
consultas regulares sem fina parâmetros de trabalho, mas consultas parametrizadas agir como se os parâmetros não estão recebendo passado.
ex.
--this works fine
Select * from tbl1 where column1 = 'test'
--this doesn't
select * from tbl1 where column1 = ?
--odbc string parameter 'test'
Aqui está o que a minha ligação da corda se parece com:
"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 eu estou adicionando parâmetros para o meu comando ODBC como esta:
arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue)
...
cmd.Parameters.AddRange(arrOdbcParam)
Perdoe o partialy copiado, um pouco pseuedo código.
Solução
Pouco de necromancing aqui, mas desde que eu só lutou com um problema semelhante, aqui é como ele trabalhou com o ODBC-driver 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();
Isto procura em "mesa" para registros com o valor 12345 em "searchInt" e data de hoje no "serachDat".
Coisas a nota:
- Os parâmetros são marcados como
?
na comando SQL - Parâmetros não precisa de nome, mas a posição (e o tipo correcto) são importante
Outras dicas
parâmetros ODBC (marcadas pelo símbolo ?
) estão vinculados por posição, então você tem que certificar-se de que você adicionar os OdbcParameter
s na ordem correta. Seu nome é em seguida, sem importância, mas gostaria de sugerir paramName
, sem a @
que é um SQL Server (ou melhor, Microsoft) formato de nome específico.
Você também pode tentar usar o formato do parâmetro Oracle, que deve ser reconhecido pelo ODBC da Microsoft para Oracle motorista e permitiria que você a ligação por nome em vez (não 100% de certeza sobre isso, embora):
- Substitua
?
por:paramName
em sua consulta. - Nome do seu parâmetro
paramName
.
Tente usar ": paramName" em vez de "paramName".