Oracle 12c到11g

时间:2014-08-09 22:20:34

标签: sql database oracle oracle11g oracle12c

我设计了一个连接到oracle 12c服务器的Windows窗体应用程序。 一切都很好,直到我发现客户端有32位操作系统,而oracle c只能安装在64位操作系统上。

我已经尝试了一周的时间来调整我的应用程序以使用oracle 11g,因为这个版本可以安装在我的客户端计算机上,它正在成为一个无望的任务。 用于oracle 11g的ODBC没有包含Oracle.ManagedDataAccess.dll,并且Oracle.DataAccess也无法从我正在使用的存储过程中读取布尔数据类型。 我要么修改我的所有程序,要么尝试修复与Oracle.ManagedDataAccess.dll相关的所有问题,或者首先使用oracle 11g开发新的应用程序。 我在虚拟机上安装了32位Windows 7并且一直在使用它,由我的应用程序的一个非常小的版本启动,它我工作,但需要太多时间!

  • 是否有更快的方法或解决方案使我的应用程序与oracle 11g兼容?
  • 真的oracle 11g比oracle 12c更适合弱电和有限电脑吗? (如果我设法说服客户安装64位操作系统并重新安装他正在使用的所有程序):客户端有2GB的RAM

更新:

我按照说明安装了打包,现在应用程序正在运行。唯一的问题是我在添加Boolean类型的参数时出错,错误是:' Oracle.DataAccess.Client.OracleDbType'不包含Boolean

的定义

这是我用来调用程序的代码:

tring constr = "DATA SOURCE=localhost;PASSWORD=kidzclubadministration;PERSIST SECURITY INFO=True;USER ID=C##KidzClub";
OracleConnection con = new OracleConnection(constr);   
OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
con.Open();

cmd.CommandText = "get_admin_pass";
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("pass", OracleDbType.NVarchar2);
cmd.Parameters["pass"].Direction = ParameterDirection.Input;
cmd.Parameters["pass"].Value = password;

cmd.Parameters.Add("done", OracleDbType.Boolean);
cmd.Parameters["done"].Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();

确切的错误句子是:

Error   2   'Oracle.DataAccess.Client.OracleDbType' does not contain a definition for 'Boolean' C:\Users\Jad-HP\Desktop\Windows Application\WindowsFormsApplication1\WindowsFormsApplication1\Form5.cs  44  53  WindowsFormsApplication1

我去了OracleDbType定义,找不到Boolean的定义:

#region Assembly Oracle.DataAccess.dll, v2.111.7.20
// C:\app\Jad-HP\product\11.1.0\client_2\ODP.NET\bin\2.x\Oracle.DataAccess.dll
#endregion

using System;

namespace Oracle.DataAccess.Client
{
public enum OracleDbType
{
    BFile = 101,
    Blob = 102,
    Byte = 103,
    Char = 104,
    Clob = 105,
    Date = 106,
    Decimal = 107,
    Double = 108,
    Long = 109,
    LongRaw = 110,
    Int16 = 111,
    Int32 = 112,
    Int64 = 113,
    IntervalDS = 114,
    IntervalYM = 115,
    NClob = 116,
    NChar = 117,
    NVarchar2 = 119,
    Raw = 120,
    RefCursor = 121,
    Single = 122,
    TimeStamp = 123,
    TimeStampLTZ = 124,
    TimeStampTZ = 125,
    Varchar2 = 126,
    XmlType = 127,
    Array = 128,
    Object = 129,
    Ref = 130,
    BinaryDouble = 132,
    BinaryFloat = 133,
}
}

虽然在我使用oracle 12c开发的Visual Studio中使用相同的定义时,我有一个Boolean的定义:

#region Assembly Oracle.DataAccess.dll, v4.121.1.0
// D:\app\Jad-HP\product\12.1.0\client_2\ODP.NET\bin\4\Oracle.DataAccess.dll
#endregion

using System;

namespace Oracle.DataAccess.Client
{
public enum OracleDbType
{
    BFile = 101,
    Blob = 102,
    Byte = 103,
    Char = 104,
    Clob = 105,
    Date = 106,
    Decimal = 107,
    Double = 108,
    Long = 109,
    LongRaw = 110,
    Int16 = 111,
    Int32 = 112,
    Int64 = 113,
    IntervalDS = 114,
    IntervalYM = 115,
    NClob = 116,
    NChar = 117,
    NVarchar2 = 119,
    Raw = 120,
    RefCursor = 121,
    Single = 122,
    TimeStamp = 123,
    TimeStampLTZ = 124,
    TimeStampTZ = 125,
    Varchar2 = 126,
    XmlType = 127,
    Array = 128,
    Object = 129,
    Ref = 130,
    BinaryDouble = 132,
    BinaryFloat = 133,
    Boolean = 134,
}
}

除了修改所有过程并替换所有布尔变量之外,还有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Oracle Managed Data Access DLL与11g数据库通信。我现在正在制作一个应用程序。

我不能说我已经安装了Oracle 12c数据库,甚至还没有安装12c Oracle客户端,所以我不能说是否需要32位客户端。我从NuGet获得了Oracle托管数据访问DLL,并且通过在连接字符串中使用connect descriptor而不是TNS名称来避免使用Oracle客户端。我不明白为什么你不能在你的应用程序中使用这种方法。