0

我设计了一个连接到 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

更新 :

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

这是我用来调用该过程的代码:

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,
}
}

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

4

1 回答 1

0

您可以使用 Oracle Managed Data Access DLL 与 11g 数据库通信。我现在有一个生产应用程序正在这样做。

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

于 2014-08-09T22:39:46.923 回答