我正在尝试将现有的 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
有很多我不知道的事情,很难弄清楚我认为我已经解决的上述问题中的哪一个实际上导致了我的问题。我将非常感谢您的专家意见。非常感谢。