Verwenden von Parametern mit einer Oracle-ODBC-Verbindung
Frage
Ich verbinde erfolgreich zu einer Oracle 10g DB mit dem Microsoft ODBC-Treiber für Oracle.
Regelmäßige Abfragen ohne Parameter funktionieren, aber parametrisierte Abfragen handeln, als ob die Parameter nicht in übergeben werden, zu werden.
ex.
--this works fine
Select * from tbl1 where column1 = 'test'
--this doesn't
select * from tbl1 where column1 = ?
--odbc string parameter 'test'
Hier ist, was meine Verbindungszeichenfolge wie folgt aussieht:
"Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=" & pstrServer & ")(PORT=" & pintPort.ToString & "))" & _
"(CONNECT_DATA=(SERVICE_NAME=" & pstrPhysicalName & "))); " & _
"uid=" & pstrUserName & ";pwd=" & pstrPassword & ";"
Und ich bin Hinzufügen von Parametern zu meinem ODBC-Befehl wie folgt aus:
arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue)
...
cmd.Parameters.AddRange(arrOdbcParam)
Vergib die partialy kopiert, etwas pseuedo Code.
Lösung
Bit von necromancing hier, aber da ich gerade mit einem ähnlichen Problem zu kämpfen, hier ist, wie es mit den ODBC-Treiber für Centura SQLBase gearbeitet:
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();
Dies sucht in „Tabelle“ für Datensätze mit dem Wert 12345 in „searchInt“ und heutiges Datum in „serachDat“.
Dinge zu beachten:
- Parameter werden als
?
in der markiert SQL-Befehl - Parameter brauchen keinen Namen, aber Position (und die korrekte Art) ist wichtig
Andere Tipps
ODBC-Parameter (durch das Symbol ?
markiert) sind je nach Position gebunden ist, so müssen Sie sicherstellen, dass Sie die OdbcParameter
s in der richtigen Reihenfolge hinzufügen. Ihr Name ist dann unwichtig, aber ich würde paramName
vorschlagen, ohne die @
, die ein SQL Server (oder, besser gesagt, Microsoft) bestimmte Namen Format.
Sie können auch versuchen, das Oracle-Parameter-Format zu verwenden, das von der Microsoft ODBC-Treiber für Oracle anerkannt werden sollte und Sie erlauben würde, namentlich Bindung statt (nicht zu 100% sicher über diese, obwohl):
- Ersetzen
?
durch:paramName
in Ihrer Anfrage. - Benennen Sie Ihre Parameter
paramName
.
Versuchen Sie es mit ": paramName" statt "paramName".