本人在维护一个系统时,开始使用ADO.NET连接ORACLE,后来客户提出用ODP.NET也可以连接。但之前SELECT文里有参数,在ADO.NET是正常的,换成ODP.NET就出错。
使用OracleDataAdapter.Fill的方法、以下是SQL文运行的情况。
SQL文:
select ColA as TitleA, :ColB as TitleB from TableName;
※:ColB是参数。
□ADO.NET的场合(System.Data.OracleClient):
・代码:
command.CommandText = "select ColA as TitleA, :ColB as TitleB from TableName"
command.Parameters.Add("ColB", OracleType.VarChar, 20).Value= "2008"
Dim da As OracleDataAdapter = New OracleDataAdapter(command)
Dim dt As DataTable = New DataTable("Test")
da.Fill(dt)
・结果:
成功
□ODP.NET的场合(Oracle.DataAccess.Client):
・代码:
command.CommandText = "select ColA as TitleA, :ColB as TitleB from TableName"
command.Parameters.Add("ColB", OracleDbType.Varchar2, 20, "2008",ParameterDirection.Input)
Dim da As OracleDataAdapter = New OracleDataAdapter(command)
Dim dt As DataTable = New DataTable("Test")
da.Fill(dt)
・结果:
例外:ORA-01036: 非法的变量名/编号。
※再現環境
・Oracle 10g和ODP.NET 10g
- Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 -32bit Production
- Oracle Data Provider for .NET 2.0 10.2.0.2.21 Production
・Oracle 11g和ODP.NET 11g
- Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -64bit Production
- Oracle Database 11g Release 1 Client (11.1.0.6.0) for Microsoft Windows 32bit
- Oracle Data Provider for .NET 2.0 11.1.0.6.20 Production
这是ODP.NET的问题,在使用时要注意。