【发布时间】:2014-06-03 20:32:10
【问题描述】:
我正在尝试将现有的 SQL Server 数据库和 vb.net 应用程序转换为使用 Oracle 和 odp.net,我是一个完整的 Oracle 新手,但在 SQL Server 方面经验丰富,因此在此过程中遇到了几个问题我想我已经解决了如下:
1) 现有数据使用 GUID 作为大多数表的主键(因为数据正在跨未连接的数据库同步)。我的第一个问题是看似 oracle 不直接支持 GUID。我研究并获得了使用 RAW(16) 的解决方案,因此我的表是使用 RAW(16) 创建的,而原始使用的 GUID
2) 接下来有很多 BIT 值,同样,oracle 似乎并不直接支持 BIT,而且我已经看到很多关于使用什么的争论,例如CHAR(1) 或 NUMBER(1,0)。最后我选择了 NUMBER(1,0)
3) 第三,现有数据库广泛使用存储过程和参数化视图(SELECT 语句),我似乎发现 Oracle 并没有以同样的方式真正做到这一点。从网上环顾四周,似乎大多数人建议使用 RefCursor 作为存储过程中的输出参数。这是我最终对一个简单表的查询,该表有一个 RAW(16) 主“ClockingID”、一个 RAW(16) 外键“UserID”、一个日期“Clocking”和一个 Number(1) “已删除”:
create or replace procedure Time_Clocking_GetForDateRange(FromDate in date, ToDate in date, ForUserID in Raw ,rc OUT SYS_REFCURSOR) as
begin
OPEN rc FOR
SELECT *
FROM Time_Clocking
WHERE (Time_Clocking.Clocking>=FromDate And Time_Clocking.Clocking<=ToDate) AND Time_Clocking.UserID=ForUserID AND Time_Clocking.Deleted=0
ORDER BY Time_Clocking.Clocking;
END;
我的vb代码如下(注意这只是为了测试从数据库中获取信息):
Dim dbCommand As Oracle.ManagedDataAccess.Client.OracleCommand = Nothing
Dim db As Oracle.ManagedDataAccess.Client.OracleConnection = DAL.Utility.GetOracleDB()
db.Open()
Dim cmd As String = "Time_Clocking_GetForDateRange"
dbCommand = New Oracle.ManagedDataAccess.Client.OracleCommand(cmd, db)
dbCommand.CommandType = CommandType.StoredProcedure
dbCommand.BindByName = True
Dim param1 As New Oracle.ManagedDataAccess.Client.OracleParameter
param1.ParameterName = "rc"
param1.OracleDbType = Oracle.ManagedDataAccess.Client.OracleDbType.RefCursor
param1.Direction = ParameterDirection.ReturnValue
dbCommand.Parameters.Add(param1)
dbCommand.Parameters.Add("FromDate", New Date(2014, 6, 1, 0, 0, 0))
dbCommand.Parameters.Add("ToDate", New Date(2014, 6, 1, 23, 59, 59))
dbCommand.Parameters.Add("ForUserID", Oracle.ManagedDataAccess.Client.OracleDbType.Raw, New Guid("367C37E05E26DE4FB625B3663B0CAA15").ToByteArray, ParameterDirection.Input)
Dim dt As New DataTable
dt.Load(dbCommand.ExecuteReader(CommandBehavior.CloseConnection))
在 ExecuteReader 点,应用程序崩溃并出现以下情况:
ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'TIME_CLOCKING_GETFORDATERANGE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
这里有很多我不知道的事情,很难弄清楚我认为我已经解决的上述问题中的哪一个实际上导致了我的问题。我将非常感谢您的专家意见。非常感谢。
【问题讨论】:
-
REF光标上的参数方向应为OUT。 ReturnValue 用于函数。如果您在修复该错误后继续收到错误,请尝试创建一个仅获取日期或仅获取 RAW 的包装函数。我认为这将是其中之一,尽管我没有方便的示例代码。
-
噢!我期待一些复杂的事情,但这解决了我的直接问题!现在我只需要弄清楚为什么它没有返回任何行,但希望这会更明显。非常感谢您的帮助。
-
好的,太好了。我将其添加为答案。
标签: oracle parameters guid odp.net ora-06550