Skip to content

Commit

Permalink
Oracle免客户端测试
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Oct 27, 2011
1 parent 6ddcc41 commit c848522
Show file tree
Hide file tree
Showing 7 changed files with 690 additions and 9 deletions.
Binary file modified DLL/Oracle/Oracle.DataAccess.dll
Binary file not shown.
12 changes: 10 additions & 2 deletions Test/App.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<appSettings>
<!--是否启用网络调试。默认为不启用-->
<add key="NewLife.Net.Debug" value="true"/>
Expand All @@ -26,7 +29,7 @@
<!--要排除的链接名,多个用逗号分隔,默认空。-->
<add key="XCode.Schema.Exclude" value=""/>
<!--连接名映射,把实体类中的Test2和Test3连接名映射到Test去-->
<add key="XCode.ConnMaps" value="Common#Common3,EntityTest@Oracle"/>
<add key="XCode.ConnMaps" value="Common#Oracle,EntityTest@Oracle"/>

<!--模版引擎配置-->
<!--是否启用调试,默认不启用-->
Expand All @@ -49,6 +52,11 @@
<add name="Common3" connectionString="Data Source=Common.db;Version=3;" providerName="Sqlite"/>
<!--启用OLEDB连接池OLE DB Services=-1(EnableAll = -1)-->
<add name="Common4" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=~\AppData\Common.mdb;Persist Security Info=False;"/>
<add name="Oracle" connectionString="Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.34)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORC)));User ID=admin;Password=admin;" providerName="System.Data.OracleClient"/>
<add name="Oracle" connectionString="Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = jslswb.com)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORC)));User ID=admin;Password=admin;" providerName="System.Data.OracleClient"/>
</connectionStrings>
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="D:\Pro\Instantclient" />
</settings>
</oracle.dataaccess.client>
</configuration>
22 changes: 22 additions & 0 deletions Test/OpsInit.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Security;

namespace Test
{
//[SuppressUnmanagedCodeSecurity]
internal class OpsInit
{
//public OpsInit();
[DllImport("OraOps11w.dll")]
public static extern int CheckVersionCompatibility(string version);
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int GetFileAttributes(string fileName);
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr LoadLibrary(string fileName);
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int SetDllDirectory(string pathName);
}
}
395 changes: 395 additions & 0 deletions Test/OraTrace.cs

Large diffs are not rendered by default.

237 changes: 237 additions & 0 deletions Test/OracleInit.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Security.Permissions;
using System.Reflection;
using Oracle.DataAccess.Client;
using System.Collections.Specialized;
using System.Configuration;
using Microsoft.Win32;

namespace Test
{
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
internal class OracleInit
{
public static bool bSetDllDirectoryInvoked = false;
private static OperatingSystem os = Environment.OSVersion;
private static int m_nMajorVer = os.Version.Major;
private static int m_nMinorVer = os.Version.Minor;
private static Timer m_timer;
public static bool s_bFromConfigFileAppEdition = false;
public static bool s_bFromConfigFileDbNRI = false;
public static bool s_bFromConfigFileDP = false;
public static bool s_bFromConfigFileMaxStatementCacheSize = false;
public static bool s_bFromConfigFileMP = false;
public static bool s_bFromConfigFileOrclPerm = false;
public static bool s_bFromConfigFileSelfTuning = false;
public static string s_DllPath;
private static object s_lockObj = new object();

private static string GetAssemblyVersion()
{
string fullName = Assembly.GetAssembly(typeof(OracleConnection)).FullName;
int startIndex = fullName.IndexOf("Version=") + 8;
int index = fullName.IndexOf(",", startIndex);
if (index > startIndex && startIndex > 0) return fullName.Substring(startIndex, index - startIndex);
return null;
}

[ConfigurationPermission(SecurityAction.Assert, Unrestricted = true)]
private static string GetDllDirectory(string version)
{
OraTrace.m_configSection = ConfigurationManager.GetSection("oracle.dataaccess.client") as NameValueCollection;
OraTrace.m_configSectionRead = true;
if (OraTrace.m_configSection != null)
{
string str = OraTrace.m_configSection["Edition"];
if (str != null)
{
string[] strArray = str.Split(new char[] { ',' });
if (strArray.Length > 1) str = strArray[strArray.Length - 1];
}
if (str != null && str != string.Empty)
{
OraTrace.m_appEdition = str;
s_bFromConfigFileAppEdition = true;
}
string s = OraTrace.m_configSection["MetadataPooling"];
if (s != null)
{
string[] strArray2 = s.Split(new char[] { ',' });
if (strArray2.Length > 1) s = strArray2[strArray2.Length - 1];
}
if (s != null && s != string.Empty)
{
OraTrace.m_MetadataPooling = int.Parse(s);
s_bFromConfigFileMP = true;
}
string str3 = OraTrace.m_configSection["DbNotificationRegInterval"];
if (str3 != null)
{
string[] strArray3 = str3.Split(new char[] { ',' });
if (strArray3.Length > 1) str3 = strArray3[strArray3.Length - 1];
}
if (str3 != null && str3 != string.Empty)
{
OraTrace.m_DBNotificationRegInterval = int.Parse(str3);
s_bFromConfigFileDbNRI = true;
}
string str4 = OraTrace.m_configSection["DemandOraclePermission"];
if (str4 != null)
{
string[] strArray4 = str4.Split(new char[] { ',' });
if (strArray4.Length > 1) str4 = strArray4[strArray4.Length - 1];
}
if (str4 != null && str4 != string.Empty)
{
OraTrace.m_demandOrclPermission = int.Parse(str4);
s_bFromConfigFileOrclPerm = true;
}
string str5 = OraTrace.m_configSection["SelfTuning"];
if (str5 != null)
{
string[] strArray5 = str5.Split(new char[] { ',' });
if (strArray5.Length > 1) str5 = strArray5[strArray5.Length - 1];
}
if (str5 != null && str5 != string.Empty)
{
OraTrace.m_selfTuning = Convert.ToBoolean(int.Parse(str5));
s_bFromConfigFileSelfTuning = true;
}
string str6 = OraTrace.m_configSection["MaxStatementCacheSize"];
if (str6 != null)
{
string[] strArray6 = str6.Split(new char[] { ',' });
if (strArray6.Length > 1) str6 = strArray6[strArray6.Length - 1];
}
if (str6 != null && str6 != string.Empty)
{
OraTrace.InitializeMaxStatementCacheSize(int.Parse(str6));
s_bFromConfigFileMaxStatementCacheSize = true;
}
string str7 = OraTrace.m_configSection["DllPath"];
if (str7 != null)
{
string[] strArray7 = str7.Split(new char[] { ',' });
if (strArray7.Length > 1) str7 = strArray7[strArray7.Length - 1];
}
if (str7 != null && str7 != string.Empty)
{
s_DllPath = str7;
s_bFromConfigFileDP = true;
}
}
RegistryKey key2 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Oracle\ODP.NET");
if (key2 != null)
{
string[] subKeyNames = key2.GetSubKeyNames();
for (int i = 0; i < subKeyNames.Length; i++)
{
if (version == subKeyNames[i])
{
RegistryKey key3 = key2.OpenSubKey(version);
if (key3 != null)
{
if (!s_bFromConfigFileMP)
{
string str8 = key3.GetValue("MetadataPooling") as string;
if (str8 != null) OraTrace.m_MetadataPooling = int.Parse(str8);
}
if (!s_bFromConfigFileAppEdition)
{
string str9 = key3.GetValue("Edition") as string;
if (str9 != null) OraTrace.m_appEdition = str9;
}
if (!s_bFromConfigFileDbNRI)
{
string str10 = key3.GetValue("DbNotificationRegInterval") as string;
if (str10 != null) OraTrace.m_DBNotificationRegInterval = int.Parse(str10);
}
if (!s_bFromConfigFileOrclPerm)
{
string str11 = key3.GetValue("DemandOraclePermission") as string;
if (str11 != null) OraTrace.m_demandOrclPermission = int.Parse(str11);
}
if (!s_bFromConfigFileSelfTuning)
{
string str12 = key3.GetValue("SelfTuning") as string;
if (str12 != null) OraTrace.m_selfTuning = Convert.ToBoolean(int.Parse(str12));
}
if (!s_bFromConfigFileMaxStatementCacheSize)
{
string str13 = key3.GetValue("MaxStatementCacheSize") as string;
if (str13 != null) OraTrace.InitializeMaxStatementCacheSize(int.Parse(str13));
}
if (!s_bFromConfigFileDP) s_DllPath = key3.GetValue("DllPath") as string;
}
}
}
}
return s_DllPath;
}

public static void Initialize()
{
int errCode = -1;
string assemblyVersion = GetAssemblyVersion();
if (m_nMajorVer >= 5 && m_nMinorVer > 0 || m_nMajorVer >= 6)
{
lock (s_lockObj)
{
if (!bSetDllDirectoryInvoked && assemblyVersion != null && assemblyVersion != string.Empty)
{
string dllDirectory = GetDllDirectory(assemblyVersion);
if (dllDirectory != null && dllDirectory != string.Empty)
{
try
{
if (OpsInit.GetFileAttributes(dllDirectory + @"\oci.dll") == -1)
{
string fileName = dllDirectory + @"\..\OCI.DLL";
if (OpsInit.GetFileAttributes(fileName) != -1) OpsInit.LoadLibrary(fileName);
}
errCode = OpsInit.SetDllDirectory(dllDirectory);
}
catch
{
}
}
}
}
}
if (!OraTrace.m_RegistryRead)
{
lock (OraTrace.m_regReadSync)
{
if (!OraTrace.m_RegistryRead)
{
bSetDllDirectoryInvoked = true;
try
{
errCode = OpsInit.CheckVersionCompatibility(assemblyVersion);
//if (errCode != 0) throw new OracleException(errCode);
}
catch
{
//throw new OracleException(ErrRes.INIT_DLL_VERSION_MISMATCH);
}
OraTrace.GetConfigInfo();
try
{
TimerCallback callback = new TimerCallback(OracleInit.TimerCallbackFunc);
uint dueTime = 0x8cebc16;
m_timer = new Timer(callback, null, dueTime, dueTime);
}
catch
{
}
}
}
}
}

private static void TimerCallbackFunc(object state) { }
}
}
26 changes: 19 additions & 7 deletions Test/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
using XCode;
using XCode.Accessors;
using System.Text;
using System.Reflection;
using System.Data.Common;
using NewLife.Reflection;

namespace Test
{
Expand All @@ -25,7 +28,7 @@ static void Main(string[] args)
try
{
#endif
Test2();
Test2();
#if !DEBUG
}
catch (Exception ex)
Expand Down Expand Up @@ -64,14 +67,23 @@ static void Test1()

static void Test2()
{
Administrator admin = Administrator.FindAll()[0];
Type type = TypeX.GetType("Oracle.DataAccess.Client.OpsInit", true);
//MethodInfoX mix = MethodInfoX.Create(type, "CheckVersionCompatibility");
//mix.Invoke(null, "2.112.1.0");
//OpsInit.CheckVersionCompatibility("2.112.1.0");
OracleInit.Initialize();

IEntityAccessor accessor = EntityAccessorFactory.Create(EntityAccessorTypes.Xml);
MemoryStream ms = new MemoryStream();
//Administrator admin = Administrator.FindAll()[0];
//Console.WriteLine(admin);

Assembly asm = Assembly.LoadFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Oracle.DataAccess.dll"));
type = asm.GetType("Oracle.DataAccess.Client.OracleClientFactory");

FieldInfo field = type.GetField("Instance");
//DbProviderFactory df= Activator.CreateInstance(type) as DbProviderFactory;

accessor.SetConfig("stream", ms).SetConfig("allfields", true).Write(admin);
String xml = Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine(xml);
DbProviderFactory df = field.GetValue(null) as DbProviderFactory;
Console.WriteLine(df);
}
}
}
7 changes: 7 additions & 0 deletions Test/Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,21 @@
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
</PropertyGroup>
<ItemGroup>
<Reference Include="Oracle.DataAccess, Version=2.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
<HintPath>..\DLL\Oracle\Oracle.DataAccess.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Management" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="OpsInit.cs" />
<Compile Include="OracleInit.cs" />
<Compile Include="OraTrace.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SerialTest.cs" />
Expand Down

0 comments on commit c848522

Please sign in to comment.