我需要使用 ODBC 连接器检索 Oracle 存储过程的参数信息。一个非常简单的存储过程示例:
create or replace
PROCEDURE TESTPROC(param1 IN INTEGER)
AS
BEGIN
//body
END TESTPROC;
现在我想检索“TESTPROC”的参数信息。
我尝试的第一个解决方案是使用OdbcCommandBuilder。我用命令类型构造了一个 OdbcCommand:存储过程,命令文本:过程名称(例如 TESTPROC)。然后我使用了这样的派生函数:“ OdbcCommandBuilder.DeriveParameters(cmd); ”
问题是我在调用这个函数时得到一个无效的转换异常:“指定的转换无效。”;带有堆栈跟踪:
at System.Data.Odbc.OdbcDataReader.GetInt16(Int32 i)
at System.Data.Odbc.OdbcCommandBuilder.DeriveParametersFromStoredProcedure(OdbcConnection connection, OdbcCommand command)
at System.Data.Odbc.OdbcCommandBuilder.DeriveParameters(OdbcCommand command)
如果我将参数类型声明为 NUMERIC,该错误也会重现。奇怪的是,如果参数是 char 或 string 类型,我可以获得正确的参数信息。尝试转换 Oracle 数字类型时似乎存在错误。
我也尝试获取这样的过程参数的架构,但没有成功:
string[] restrictions = new string[3];
restrictions[0] = null;
restrictions[1] = null;
restrictions[2] = "MyOwner.TESTPORC";
DataTable dt = conn.GetSchema(OdbcMetaDataCollectionNames.ProcedureParameters, restrictions);
这里的问题是我无法检索 DataTable 中的任何行,我猜这是因为相同的类型转换问题。
我想知道是否有一些解决方法可以解决这个问题。我使用的平台是Windows 8 x64,Oracle客户端是instantclient_12_1