tijian_tieying/web/cyqdata-master/DAL/OracleDal.cs
2025-02-20 12:14:39 +08:00

263 lines
9.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Data.OracleClient;
//using Oracle.DataAccess.Client;
using System.Data;
using System;
using System.Data.Common;
using System.Reflection;
using CYQ.Data.Tool;
using CYQ.Data.Cache;
namespace CYQ.Data
{
internal class OracleDal : DbBase
{
/// <summary>
/// 区分Oracle11和Oracle12的Dll名称。
/// </summary>
public static string ManagedName = "Managed";
public OracleDal(ConnObject co)
: base(co)
{
}
protected override void AddReturnPara()
{
if (!Com.Parameters.Contains("ResultCount"))
{
AddParameters("ResultCount", DBNull.Value, DbType.Int32, -1, ParameterDirection.Output);//记录总数在最后一位
}
if (!Com.Parameters.Contains("ResultCursor"))
{
AddCustomePara("ResultCursor", ParaType.Cursor, DBNull.Value, null);
}
}
internal override void AddCustomePara(string paraName, ParaType paraType, object value, string typeName)
{
if (IsUseOdpNet)
{
AddParaForOdpNet(paraName, paraType, value);
}
else
{
AddParaForOracleClient(paraName, paraType, value);
}
}
private void AddParaForOracleClient(string paraName, ParaType paraType, object value)
{
if (Com.Parameters.Contains(paraName)) { return; }
OracleParameter para = new OracleParameter();
para.ParameterName = paraName;
switch (paraType)
{
case ParaType.Cursor:
case ParaType.OutPut:
if (paraType == ParaType.Cursor)
{
para.OracleType = OracleType.Cursor;
}
else
{
para.OracleType = OracleType.NVarChar;
para.Size = 4000;
}
para.Direction = ParameterDirection.Output;
break;
case ParaType.ReturnValue:
para.OracleType = OracleType.Int32;
para.Direction = ParameterDirection.ReturnValue;
break;
case ParaType.CLOB:
case ParaType.NCLOB:
para.OracleType = paraType == ParaType.CLOB ? OracleType.Clob : OracleType.NClob;
para.Direction = ParameterDirection.Input;
if (value != null)
{
para.Value = value;
}
break;
}
Com.Parameters.Add(para);
}
private void AddParaForOdpNet(string paraName, ParaType paraType, object value)
{
Assembly ass = GetAssembly();
//工厂方法理解点
DbParameter para = ass.CreateInstance("Oracle." + ManagedName + "DataAccess.Client.OracleParameter") as DbParameter;
para.ParameterName = paraName;
switch (paraType)
{
case ParaType.Cursor:
case ParaType.OutPut:
if (paraType == ParaType.Cursor)
{
para.GetType().GetProperty("OracleDbType").SetValue(para, OracleDbType.RefCursor, null);
}
else
{
para.DbType = DbType.String;
para.Size = 4000;
}
para.Direction = ParameterDirection.Output;
value = DBNull.Value;
break;
case ParaType.ReturnValue:
para.DbType = DbType.Int32;
para.Direction = ParameterDirection.ReturnValue;
value = DBNull.Value;
break;
case ParaType.CLOB:
case ParaType.NCLOB:
para.GetType().GetProperty("OracleDbType").SetValue(para, paraType == ParaType.CLOB ? OracleDbType.Clob : OracleDbType.NClob, null);
para.Direction = ParameterDirection.Input;
if (value != null)
{
para.Value = value;
}
break;
}
Com.Parameters.Add(para);
}
public override char Pre
{
get
{
return ':';
}
}
internal static Assembly GetAssembly()
{
object ass = CacheManage.LocalInstance.Get("OracleClient_Assembly");
if (ass == null)
{
//try
//{
ass = Assembly.Load("Oracle." + ManagedName + "DataAccess");
CacheManage.LocalInstance.Set("OracleClient_Assembly", ass, 10080);
//}
//catch(Exception err)
//{
// Error.Throw(errMsg);
//}
}
return ass as Assembly;
}
/// <summary>
/// 抽象工厂
/// </summary>
protected override DbProviderFactory GetFactory(string providerName)
{
if (IsUseOdpNet)
{
object factory = CacheManage.LocalInstance.Get("OracleClient_Factory");
if (factory == null)
{
Assembly ass = GetAssembly();
factory = ass.CreateInstance("Oracle." + ManagedName + "DataAccess.Client.OracleClientFactory");
if (factory == null)
{
throw new System.Exception("Can't Create OracleClientFactory in Oracle." + ManagedName + "DataAccess.dll");
}
else
{
CacheManage.LocalInstance.Set("OracleClient_Factory", factory, 10080);
}
}
return factory as DbProviderFactory;
}
else
{
return base.GetFactory(providerName);
}
}
/// <summary>
/// 值-1未初始化0使用OracleClient1使用DataAccess2使用ManagedDataAccess
/// </summary>
internal static int clientType = -1;
private static readonly object lockObj = new object();
/// <summary>
/// 是否使用Oracle的ODP.NET组件。
/// </summary>
private bool IsUseOdpNet
{
get
{
if (clientType == -1)
{
lock (lockObj)
{
if (clientType == -1)
{
if (AppConfig.GetConn(base.conn).IndexOf("host", StringComparison.OrdinalIgnoreCase) == -1)
{
clientType = 0;
}
else
{
string path = AppConst.RunFolderPath;
if (System.IO.File.Exists(path + "Oracle." + ManagedName + "DataAccess.dll"))//Oracle 12
{
clientType = 2;
}
else if (System.IO.File.Exists(path + "Oracle.DataAccess.dll")) ////Oracle 11
{
ManagedName = "";
clientType = 1;
}
else
{
clientType = 0;
Log.WriteLog("Can't find Oracle.ManagedDataAccess.dll or Oracle.DataAccess.dll on the path:" + path);
}
}
}
}
}
return clientType > 0;
}
}
protected override bool IsExistsDbName(string dbName)
{
return DBTool.TestConn(GetNewConn(dbName));
}
}
internal 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,
}
}