我需要使用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