?? dataaccess.cs
字號:
using System;
using System.IO ;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Web.Caching ;
using DocAdmin.COMMON ;
namespace DocAdmin.DAL
{
/// <summary>
/// DataAccess 的摘要說明。
/// </summary>
public class DataAccess
{
private static SqlConnection _connection ;
private static SqlCommand _command ;
private static SqlDataAdapter _adapter ;
// private static SqlCommand _command_ds ;
// private static SqlCommand _command_sl ;
//創建自己的Hashtable
private static Hashtable myCache = Hashtable.Synchronized(new Hashtable());
#region 初始化
/// <summary>
/// 初始化數據連接
/// </summary>
/// <returns>true:成功 false:失敗</returns>
public static bool InitConn()
{
bool ret = true ;
//獲取web.config中配置的數據連接字串
string str_conn = DocAdminGlobals.ConnectionString ;
if(str_conn != "")
//初始化數據連接
_connection = new SqlConnection(str_conn) ;
else
{
//獲取字串失敗,寫日志
Trace.Write("InitCommand","Error","從web.config獲取數據連接字串失敗.") ;
ret = false ;
return ret ;
}
//初始化命令
_command = new SqlCommand() ;
//為命令設置數據連接
_command.Connection = _connection ;
//初始化數據適配器
_adapter = new SqlDataAdapter() ;
return ret ;
}
#endregion
#region 參數賦值
/// <summary>
/// 將SQL參數隊列值賦給SQL命令(SQL語句或存儲過程)
/// </summary>
/// <param name="commandParameters">待指定給SQL命令的參數隊列</param>
private static void AttachParameters(SqlParameter[] commandParameters)
{
foreach (SqlParameter p in commandParameters)
{
//給為null的輸出參數賦值
if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
{
p.Value = DBNull.Value;
}
_command.Parameters.Add(p);
}
}
/// <summary>
/// 將參數值序列賦值給對應的參數序列
/// </summary>
/// <param name="commandParameters">待賦值的參數序列</param>
/// <param name="parameterValues">參數值序列</param>
private static bool AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
{
bool ret = true ;
if ((commandParameters == null) || (parameterValues == null))
{
//若參數為null,返回
return ret;
}
// 參數數組長度與參數值數組長度需匹配
if (commandParameters.Length != parameterValues.Length)
{
ret = false ;
Trace.Write("AssignParameterValues","Error","參數個數和參數值個數不匹配.");
return ret;
}
//循環為參數賦值
//注意,參數與參數值在各自的序列中位置應當對應
for (int i = 0, j = commandParameters.Length; i < j; i++)
{
commandParameters[i].Value = parameterValues[i];
}
return ret;
}
/// <summary>
/// 為給定的SQL命令(SQL語句或存儲過程)打開數據連接,設置事務、命令名稱、命令類型等等
/// 并為命令的參數賦值
/// </summary>
/// <param name="commandType">命令類型</param>
/// <param name="commandText">存儲過程名或SQL語句</param>
/// <param name="commandParameters">參數序列</param>
private static void PrepareCommand(string commandText, SqlParameter[] commandParameters)
{
//若數據連接未打開,打開連接
if (_connection.State != ConnectionState.Open)
{
_connection.Open();
}
//設置command text (存儲過程名或其他SQL語句)
_command.CommandText = commandText;
//指定命令類型(存儲過程或者其他SQL語句)
_command.CommandType = CommandType.StoredProcedure;
//為參數賦值
if (commandParameters != null)
{
AttachParameters(commandParameters);
}
return;
}
#endregion
#region 執行無查詢存儲過程
/// <summary>
/// 執行無查詢存儲過程
/// </summary>
/// <param name="commandText">存儲過程名</param>
/// <param name="HasReturn">是否有返回值</param>
/// <param name="commandParameters">參數值</param>
/// <returns>返回執行結果</returns>
private static int ExecuteNonQuery_in(string commandText,bool HasReturn, params SqlParameter[] commandParameters)
{
int result = -1 ;
//創建并打開數據連接
if (_connection.State != ConnectionState.Open)
{
_connection.Open();
}
_command.Connection = _connection ;
PrepareCommand(commandText, commandParameters);
//調用執行函數
//執行命令
try
{
result = _command.ExecuteNonQuery();
}
catch(Exception e)
{
//執行失敗
//從異常中獲取失敗信息
string msg = e.Message ;
//調用寫日志方法
Trace.Write("ExecuteNonQuery","Error",commandText+"|"+msg) ;
}
if(HasReturn)
{
result = (int)_command.Parameters["@RETURN_VALUE"].Value ;
}
//清除參數
_command.Parameters.Clear();
//執行完畢后關閉連接
_connection.Close() ;
return result ;
}
/// <summary>
/// 執行無返回值的存儲過程
/// 注意參數值的順序需與存儲過程參數順序一致
/// </summary>
/// <param name="spName">存儲過程名</param>
/// <param name="parameterValues">參數值</param>
/// <returns>執行結果</returns>
public static int ExecuteNonQuery(string spName,bool hasReturns,params object[] parameterValues)
{
//如果有參數值, 先賦參數值再執行
if ((parameterValues != null) && (parameterValues.Length > 0))
{
//獲取存儲過程參數
SqlParameter[] commandParameters = GetSpParameters(spName,hasReturns);
//為存儲過程參數設定參數值
AssignParameterValues(commandParameters, parameterValues);
//調用執行帶參數值的存儲過程方法
return ExecuteNonQuery_in(spName,hasReturns, commandParameters);
}
//不帶參數
else
{
return ExecuteNonQuery_in(spName,hasReturns);
}
}
#endregion
#region 獲取存儲過程參數
/// <summary>
/// 獲取存儲過程參數數組
/// </summary>
/// <param name="spName">存儲過程名</param>
/// <param name="hasReturn">是否包含返回類型的參數</param>
/// <returns>參數數組</returns>
private static SqlParameter[] GetSpParameterSet(string spName,bool hasReturn)
{
using(SqlCommand cmd = new SqlCommand() )
{
//為命令指定連接
cmd.Connection = _connection ;
//如果數據連接未開啟,打開它
if(_connection.State != ConnectionState.Open)
{
_connection.Open() ;
}
//指定CommandText為存儲過程名
cmd.CommandText = spName ;
cmd.CommandType = CommandType.StoredProcedure ;
//從存儲過程中檢索參數,填充到Parameters集
try
{
SqlCommandBuilder.DeriveParameters(cmd) ;
}
catch(Exception e)
{
//執行失敗
//從異常中獲取失敗信息
string msg = e.Message ;
//調用寫日志方法
Trace.Write("DeriveParameters","Error",spName+"|"+msg) ;
}
//如果有返回值
if (!hasReturn)
{
cmd.Parameters.RemoveAt(0);
}
//將Parameters集中的參數復制到參數數組
SqlParameter[] para = new SqlParameter[cmd.Parameters.Count] ;
cmd.Parameters.CopyTo(para,0) ;
return para ;
}
}
/// <summary>
/// 深拷貝緩存中的參數序列
/// </summary>
/// <param name="originalParameters">源參數序列</param>
/// <returns>拷貝后的參數序列</returns>
private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters)
{
//深拷貝緩存中的參數序列
SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length];
for (int i = 0, j = originalParameters.Length; i < j; i++)
{
clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone();
}
return clonedParameters;
}
/// <summary>
/// 獲取存儲過程參數
/// </summary>
/// <param name="spName">存儲過程名</param>
/// <param name="hasReturn">是否包含返回值</param>
/// <returns>返回參數序列</returns>
public static SqlParameter[] GetSpParameters(string spName, bool hasReturn)
{
//緩存HashTable的主鍵
string cacheKey = spName + (hasReturn ? ":hasReturn":"");
//從Hachtable中獲取參數
SqlParameter[] cachedParameters = (SqlParameter[])myCache[cacheKey];
if(cachedParameters == null)
{
//如果Hachtable中沒有,調用獲取存儲過程參數數組方法
cachedParameters = (SqlParameter[])(myCache[cacheKey] = GetSpParameterSet(spName,hasReturn)) ;
}
return CloneParameters(cachedParameters);
}
#endregion
#region 執行返回DataSet的存儲過程
/// <summary>
/// 執行返回DataSet的存儲過程
/// </summary>
/// <param name="commandType">命令類型,存儲過程、Text等</param>
/// <param name="commandText">存儲過程名或SQL語句等</param>
/// <param name="commandParameters">參數序列</param>
/// <returns>查詢結果DataSet</returns>
private static DataSet ExecuteDataset_in(string commandText, params SqlParameter[] commandParameters)
{
//如果數據連接未開啟,打開它
if (_connection.State != ConnectionState.Open)
{
_connection.Open();
}
//準備命令
PrepareCommand(commandText, commandParameters);
//創建DataAdapter和DataSet
SqlDataAdapter da = new SqlDataAdapter(_command);
DataSet ds = new DataSet();
//填充DataSet
try
{
da.Fill(ds);
}
catch(Exception e)
{
//執行失敗
//從異常中獲取失敗信息
string msg = e.Message ;
//調用寫日志方法
Trace.Write("FillDataSet","Error",commandText+"|"+msg) ;
}
// 清除參數
_command.Parameters.Clear();
_connection.Close() ;
return ds ;
}
/// <summary>
/// 執行返回DataSet的存儲過程
/// </summary>
/// <param name="spName">存儲過程名</param>
/// <param name="parameterValues">參數值序列</param>
/// <returns>查詢結果DataSet</returns>
public static DataSet ExecuteDataset(string spName, params object[] parameterValues)
{
//如果有參數值, 先賦參數值再執行
if ((parameterValues != null) && (parameterValues.Length > 0))
{
//獲取存儲過程參數
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -