[英]Oracle 12c to 11g
我設計了一個連接到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.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,
}
}
除了修改所有過程並替換所有布爾變量之外,還有其他解決方案嗎?
您可以使用Oracle托管數據訪問DLL與11g數據庫進行通信。 我現在有一個生產應用程序正在執行此操作。
我不能說我已經安裝了Oracle 12c數據庫,甚至還沒有安裝12c Oracle客戶端,所以我不能說是否都需要32位客戶端。 我從NuGet獲得了Oracle托管數據訪問DLL,並且通過在連接字符串中使用連接描述符而不是TNS名稱來避免使用Oracle客戶端。 我不明白為什么您不能在您的應用程序中使用這種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.