using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data;
using System.Data.OracleClient;
using System.Collections;
using CRM.Core.Model;
namespace CRM.Core.DAL
{
public abstract class OracleHelper
{
//Read the connection strings from the configuration file
//public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["AYCRMCONN"].ConnectionString;
public static readonly string ZxdCRMConn = ConStringHelper.ZxdCRMConn;
//public static readonly string QhCrmConn = ConStringHelper.QhCrmConn;
//Create a hashtable for the parameter cached
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
///
/// Execute a database query which does not include a select
///
/// Connection string to database
/// Command type either stored procedure or SQL
/// Acutall SQL Command
/// Parameters to bind to the command
///
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
// Create a new Oracle command
OracleCommand cmd = new OracleCommand();
//Create a connection
using (OracleConnection connection = new OracleConnection(connectionString))
{
try
{
//Prepare the command
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
//Execute the command
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
finally
{
if (connection.State == ConnectionState.Open)
connection.Close();
}
}
}
///
/// dataTable批量导入数据
///
/// 连接字符串
/// 表名
/// dataTable数据源
public static void OracleBulkInsert(string connectionString, string tableName, DataTable dataTable)
{
if (dataTable.Rows.Count == 0)
{
return;
}
using (Oracle.DataAccess.Client.OracleBulkCopy oracleBulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(connectionString, Oracle.DataAccess.Client.OracleBulkCopyOptions.UseInternalTransaction))
{
try
{
oracleBulkCopy.DestinationTableName = tableName;
for (int i = 0; i < dataTable.Columns.Count; i++)
{
oracleBulkCopy.ColumnMappings.Add(dataTable.Columns[i].ColumnName,
dataTable.Columns[i].ColumnName);
}
oracleBulkCopy.WriteToServer(dataTable);
}
finally
{
if (oracleBulkCopy.Connection.State == ConnectionState.Open)
oracleBulkCopy.Connection.Close();
}
}
}
///
/// dataTable批量导入数据
///
/// 传入操作对象
/// 数据库表名
/// 要导入的dataTable
public static void OracleBulkInsert(Oracle.DataAccess.Client.OracleBulkCopy oracleBulkCopy, string tableName, DataTable dataTable)
{
if (dataTable.Rows.Count == 0)
{
return;
}
try
{
oracleBulkCopy.DestinationTableName = tableName;
for (int i = 0; i < dataTable.Columns.Count; i++)
{
oracleBulkCopy.ColumnMappings.Add(dataTable.Columns[i].ColumnName,
dataTable.Columns[i].ColumnName);
}
oracleBulkCopy.WriteToServer(dataTable);
}
finally
{
if (oracleBulkCopy.Connection.State == ConnectionState.Open)
oracleBulkCopy.Connection.Close();
}
}
///
/// dataTable批量导入数据(连接字符串默认为AYCRMConn)
///
/// 表名
/// dataTable数据源
public static void OracleBulkInsert(string tableName, DataTable dataTable)
{
OracleBulkInsert(ZxdCRMConn, tableName, dataTable);
}
///
/// 默认的连接串为AYCRMConn
///
///
///
///
///
public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
return ExecuteNonQuery(ZxdCRMConn, cmdType, cmdText, commandParameters);
}
///
/// Execute an OracleCommand (that returns no resultset) against an existing database transaction
/// using the provided parameters.
///
///
/// e.g.:
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new OracleParameter(":prodid", 24));
///
/// an existing database transaction
/// the CommandType (stored procedure, text, etc.)
/// the stored procedure name or PL/SQL command
/// an array of OracleParamters used to execute the command
/// an int representing the number of rows affected by the command
public static int ExecuteNonQuery(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
OracleCommand cmd = new OracleCommand();
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
///
/// Execute an OracleCommand (that returns no resultset) against an existing database connection
/// using the provided parameters.
///
///
/// e.g.:
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter(":prodid", 24));
///
/// an existing database connection
/// the CommandType (stored procedure, text, etc.)
/// the stored procedure name or PL/SQL command
/// an array of OracleParamters used to execute the command
/// an int representing the number of rows affected by the command
public static int ExecuteNonQuery(OracleConnection connection, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
try
{
OracleCommand cmd = new OracleCommand();
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
finally
{
if(connection.State == ConnectionState.Open)
connection.Close();
}
}
///
/// 返回一个dataset
///
///
///
///
///
///
public static DataSet DataQueray(string connectionstring, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
OracleConnection con = new OracleConnection(connectionstring);
OracleCommand cmd = new OracleCommand(cmdText, con);
try
{
cmd.CommandType = cmdType;
cmd.Parameters.AddRange(commandParameters);
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cmd.Parameters.Clear();
return ds;
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}
}
public static DataSet GetPageList(string connectionstring, CommandType cmdType, string cmdText, string orderField, string orderType, int pageIndex, int pageSize, ref int count, params OracleParameter[] commandParameters)
{
StringBuilder builder = new StringBuilder();
OracleConnection con = new OracleConnection(connectionstring);
try
{
string sqlcount = "Select Count(1) From (" + cmdText + ") t";
count = Convert.ToInt32( ExecuteScalar(connectionstring, CommandType.Text, sqlcount, commandParameters));
int num = (pageIndex - 1) * pageSize;
int num2 = pageSize;
int num3 = num + num2 + 1;
builder.Append("select * from(select t.*,rownum rn from(" + cmdText + " order by " + orderField + " " + orderType + ") t where rownum<" + num3 + ") where rn>" + num + "");
OracleCommand cmd = new OracleCommand(builder.ToString(), con);
cmd.CommandType = cmdType;
cmd.Parameters.AddRange(commandParameters);
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cmd.Parameters.Clear();
return ds;
}
catch
{
throw;
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}
}
public static DataSet DataQueray(OracleTransaction transaction, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
if (transaction == null)
throw new ArgumentNullException("transaction");
if (transaction != null && transaction.Connection == null)
throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
OracleCommand cmd = new OracleCommand();
PrepareCommand(cmd, transaction.Connection, transaction, cmdType, cmdText, commandParameters);
using (OracleDataAdapter da = new OracleDataAdapter(cmd))
{
DataSet ds = new DataSet();
da.Fill(ds);
cmd.Parameters.Clear();
return ds;
}
//OracleConnection con = new OracleConnection(connectionstring);
//OracleCommand cmd = new OracleCommand(cmdText, con);
//try
//{
// cmd.CommandType = cmdType;
// cmd.Parameters.AddRange(commandParameters);
// OracleDataAdapter da = new OracleDataAdapter(cmd);
// DataSet ds = new DataSet();
// da.Fill(ds);
// cmd.Parameters.Clear();
// return ds;
//}
//catch
//{
// con.Close();
// throw;
//}
}
///
/// 默认的连接串为AYCRMConn
///
///
///
///
///
public static DataSet DataQueray(CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
return DataQueray(ZxdCRMConn, cmdType, cmdText, commandParameters);
}
///
/// Execute a select query that will return a result set
///
/// Connection string
/// the CommandType (stored procedure, text, etc.)
/// the stored procedure name or PL/SQL command
/// an array of OracleParamters used to execute the command
///
public static OracleDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
//Create the command and connection
OracleCommand cmd = new OracleCommand();
OracleConnection conn = new OracleConnection(connectionString);
try
{
//Prepare the command to execute
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//Execute the query, stating that the connection should close when the resulting datareader has been read
OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
finally
{
conn.Close();
}
}
///
/// 默认的连接串为AYCRMConn
///
///
///
///
///
public static OracleDataReader ExecuteReader(CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
return ExecuteReader(ZxdCRMConn, cmdType, cmdText, commandParameters);
}
///
/// Execute an OracleCommand that returns the first column of the first record against the database specified in the connection string
/// using the provided parameters.
///
///
/// e.g.:
/// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter(":prodid", 24));
///
/// a valid connection string for a SqlConnection
/// the CommandType (stored procedure, text, etc.)
/// the stored procedure name or PL/SQL command
/// an array of OracleParamters used to execute the command
/// An object that should be converted to the expected type using Convert.To{Type}
public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
OracleCommand cmd = new OracleCommand();
using (OracleConnection conn = new OracleConnection(connectionString))
{
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
finally
{
conn.Close();
}
}
}
///
/// 默认的连接串为AYCRMConn
///
///
///
///
///
public static object ExecuteScalar(CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
return ExecuteScalar(ZxdCRMConn, cmdType, cmdText, commandParameters);
}
///
/// Execute a OracleCommand (that returns a 1x1 resultset) against the specified SqlTransaction
/// using the provided parameters.
///
/// A valid SqlTransaction
/// The CommandType (stored procedure, text, etc.)
/// The stored procedure name or PL/SQL command
/// An array of OracleParamters used to execute the command
/// An object containing the value in the 1x1 resultset generated by the command
public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
{
if (transaction == null)
throw new ArgumentNullException("transaction");
if (transaction != null && transaction.Connection == null)
throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
// Create a command and prepare it for execution
OracleCommand cmd = new OracleCommand();
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters);
// Execute the command & return the results
object retval = cmd.ExecuteScalar();
// Detach the SqlParameters from the command object, so they can be used again
cmd.Parameters.Clear();
return retval;
}
///
/// Execute an OracleCommand that returns the first column of the first record against an existing database connection
/// using the provided parameters.
///
///
/// e.g.:
/// Object obj = ExecuteScalar(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter(":prodid", 24));
///
/// an existing database connection
/// the CommandType (stored procedure, text, etc.)
/// the stored procedure name or PL/SQL command
/// an array of OracleParamters used to execute the command
/// An object that should be converted to the expected type using Convert.To{Type}
public static object ExecuteScalar(OracleConnection connectionString, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
try
{
OracleCommand cmd = new OracleCommand();
PrepareCommand(cmd, connectionString, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
finally
{
connectionString.Close();
}
}
///
/// Add a set of parameters to the cached
///
/// Key value to look up the parameters
/// Actual parameters to cached
public static void CacheParameters(string cacheKey, params OracleParameter[] commandParameters)
{
parmCache[cacheKey] = commandParameters;
}
///
/// Fetch parameters from the cache
///
/// Key to look up the parameters
///
public static OracleParameter[] GetCachedParameters(string cacheKey)
{
OracleParameter[] cachedParms = (OracleParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
// If the parameters are in the cache
OracleParameter[] clonedParms = new OracleParameter[cachedParms.Length];
// return a copy of the parameters
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (OracleParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
///
/// Internal function to prepare a command for execution by the database
///
/// Existing command object
/// Database connection object
/// Optional transaction object
/// Command type, e.g. stored procedure
/// Command test
/// Parameters for the command
private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, CommandType cmdType, string cmdText, OracleParameter[] commandParameters)
{
//Open the connection if required
if (conn.State != ConnectionState.Open)
conn.Open();
//Set up the command
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
//Bind it to the transaction if it exists
if (trans != null)
cmd.Transaction = trans;
// Bind the parameters passed in
if (commandParameters != null)
{
foreach (OracleParameter parm in commandParameters)
cmd.Parameters.Add(parm);
}
}
///
/// Converter to use boolean data type with Oracle
///
/// Value to convert
///
public static string OraBit(bool value)
{
if (value)
return "Y";
else
return "N";
}
///
/// Converter to use boolean data type with Oracle
///
/// Value to convert
///
public static bool OraBool(string value)
{
if (value.Equals("Y"))
return true;
else
return false;
}
#region 扩展方法
///
/// 批量插入数据
///
/// 要插入的数据
/// 数据库中的表
public static void BulkToDB(string connectionString, DataTable dt, string targetTable, int timeOut = 300)
{
if (dt.Rows.Count == 0)
{
return;
}
using (Oracle.DataAccess.Client.OracleBulkCopy oracleBulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(connectionString, Oracle.DataAccess.Client.OracleBulkCopyOptions.UseInternalTransaction))
{
try
{
oracleBulkCopy.DestinationTableName = targetTable;
for (int i = 0; i < dt.Columns.Count; i++)
{
oracleBulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName,
dt.Columns[i].ColumnName);
}
oracleBulkCopy.WriteToServer(dt);
}
finally
{
oracleBulkCopy.Connection.Close();
}
}
}
public static void BulkToDB(DataTable dt, string targetTable, int timeOut = 300)
{
BulkToDB(ZxdCRMConn, dt, targetTable, timeOut);
}
#endregion
}
}