题
我使用 Microsoft ODBC for Oracle 驱动程序成功连接到 Oracle 10g DB。
不带参数的常规查询工作正常,但参数化查询的行为就好像没有传入参数一样。
前任。
--this works fine
Select * from tbl1 where column1 = 'test'
--this doesn't
select * from tbl1 where column1 = ?
--odbc string parameter 'test'
我的连接字符串如下所示:
"Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=" & pstrServer & ")(PORT=" & pintPort.ToString & "))" & _
"(CONNECT_DATA=(SERVICE_NAME=" & pstrPhysicalName & "))); " & _
"uid=" & pstrUserName & ";pwd=" & pstrPassword & ";"
我正在向 ODBC 命令添加参数,如下所示:
arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue)
...
cmd.Parameters.AddRange(arrOdbcParam)
请原谅部分复制的、有些伪代码。
解决方案
这里有点死灵术,但由于我刚刚遇到了类似的问题,以下是它如何与 Centura SQLBase 的 ODBC 驱动程序一起工作:
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();
这会在“table”中搜索“searchInt”中值为 12345 且“serachDat”中值为今天日期的记录。
注意事项:
- 参数标记为
?
在SQL命令中 - Parameters need no name, but position (and the correct type) are important
其他提示
ODBC 参数(用符号标记 ?
) 受位置约束,因此您必须确保添加 OdbcParameter
s 按正确的顺序。他们的名字并不重要,但我建议 paramName
, ,没有 @
这是 SQL Server(或者更确切地说,Microsoft)特定的名称格式。
您还可以尝试使用 Oracle 参数格式,该格式应能被 Microsoft ODBC for Oracle 驱动程序识别,并允许您通过名称进行绑定(不过对此不能 100% 确定):
- 代替
?
经过:paramName
在你的查询中。 - 为您的参数命名
paramName
.
尝试使用“:paramName”而不是“paramName”。
不隶属于 StackOverflow