我设计了一个连接到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并且一直在使用它,由我的应用程序的一个非常小的版本启动,它我工作,但需要太多时间!
我按照说明安装了打包,现在应用程序正在运行。唯一的问题是我在添加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,
}
}
除了修改所有过程并替换所有布尔变量之外,还有其他解决方案吗?
答案 0 :(得分:0)
您可以使用Oracle Managed Data Access DLL与11g数据库通信。我现在正在制作一个应用程序。
我不能说我已经安装了Oracle 12c数据库,甚至还没有安装12c Oracle客户端,所以我不能说是否需要32位客户端。我从NuGet获得了Oracle托管数据访问DLL,并且通过在连接字符串中使用connect descriptor而不是TNS名称来避免使用Oracle客户端。我不明白为什么你不能在你的应用程序中使用这种方法。