OperateDatabase.cs檔案代碼:
using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;
using System.Configuration;
namespace Gogofly.OperateSqlServer
{
public class OperateDatabase
{
#region 定義屬性
/// <summary>
/// 定義在web.config中標識連接字串的Name屬性的值
/// </summary>
private static string connectionStringNameInWebConfig = "SQLSERVERCONNECTIONSTRING";
public static string ConnectionStringNameInWebConfig
{
get
{
return connectionStringNameInWebConfig;
}
set
{ ///字串不可為空或Null 參考
if(!string.IsNullOrEmpty(value))
{
connectionStringNameInWebConfig = value;
}
}
}
/// <summary>
/// 儲存執行資料庫操作傳回值的參數標識
/// </summary>
private static string returnValueString = "RETURNVALUESTRING";
public static string ReturnValueString
{
get
{
return returnValueString;
}
}
#endregion
#region 建立參數
/// <summary>
/// 建立參數
/// </summary>
/// <param name="ParamName">預存程序名稱</param>
/// <param name="DbType">參數類型</param>
/// <param name="Size">參數大小</param>
/// <param name="Direction">參數方向</param>
/// <param name="Value">參數值</param>
/// <returns>新的 parameter 對象</returns>
private static SqlParameter CreateParam(string ParamName,SqlDbType DbType,
Int32 Size,ParameterDirection Direction,object Value)
{
SqlParameter param;
if(Size > 0)
{ ///使用size建立大小不為0的參數
param = new SqlParameter(ParamName,DbType,Size);
}
else
{
param = new SqlParameter(ParamName,DbType);
}
///建立輸出型別參數
param.Direction = Direction;
if(!(Direction == ParameterDirection.Output && Value == null))
{
param.Value = Value;
}
///返回參數
return param;
}
/// <summary>
/// 建立輸入型別參數
/// </summary>
/// <param name="ParamName">預存程序名稱</param>
/// <param name="DbType">參數類型</param></param>
/// <param name="Size">參數大小</param>
/// <param name="Value">參數值</param>
/// <returns>新的parameter 對象</returns>
public static SqlParameter CreateInParam(string ParamName,
SqlDbType DbType,int Size,object Value)
{
return CreateParam(ParamName,DbType,Size,ParameterDirection.Input,Value);
}
/// <summary>
/// 建立輸出型別參數
/// </summary>
/// <param name="ParamName">預存程序名稱</param>
/// <param name="DbType">參數類型</param>
/// <param name="Size">參數大小</param>
/// <returns>新的 parameter 對象</returns>
public static SqlParameter CreateOutParam(string ParamName,
SqlDbType DbType,int Size)
{
return CreateParam(ParamName,DbType,Size,ParameterDirection.Output,null);
}
/// <summary>
/// 建立傳回型別參數
/// </summary>
/// <param name="ParamName">預存程序名稱</param>
/// <param name="DbType">參數類型</param>
/// <param name="Size">參數大小</param>
/// <returns>新的 parameter 對象</returns>
public static SqlParameter CreateReturnParam(string ParamName,
SqlDbType DbType,int Size)
{
return CreateParam(ParamName,DbType,Size,ParameterDirection.ReturnValue,null);
}
#endregion
#region 建立SqlCommand和SqlDataAdapter
/// <summary>
/// 建立SqlCommand對象
/// </summary>
/// <param name="procName">預存程序的名稱</param>
/// <param name="prams">預存程序所需參數</param>
/// <returns>返回SqlCommand對象</returns>
private static SqlCommand CreateSqlCommand(string procName,
params SqlParameter[] prams)
{ ///建立資料庫連接
SqlConnection sqlCon = CreateSqlConnection();
///開啟資料庫連接
if(sqlCon == null) return null;
if(sqlCon.State == ConnectionState.Closed)
{
sqlCon.Open();
}
///設定SqlCommand的屬性
SqlCommand cmd = new SqlCommand(procName,sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
///添加預存程序參數
if(prams != null)
{
foreach(SqlParameter parameter in prams)
{
cmd.Parameters.Add(parameter);
}
}
///添加返回參數
cmd.Parameters.Add(new SqlParameter(returnValueString,
SqlDbType.Int,4,ParameterDirection.ReturnValue,
false,0,0,string.Empty,DataRowVersion.Default,null));
///返回SqlCommand對象
return cmd;
}
/// <summary>
/// 建立SqlDataAdapter對象
/// </summary>
/// <param name="procName">預存程序的名稱</param>
/// <param name="prams">預存程序所需參數</param>
/// <returns>返回SqlDataAdapter對象</returns>
private static SqlDataAdapter CreateSqlDataAdapter(string procName,
params SqlParameter[] prams)
{ ///建立資料庫連接
SqlConnection sqlCon = CreateSqlConnection();
///開啟資料庫連接
if(sqlCon == null) return null;
if(sqlCon.State == ConnectionState.Closed)
{
sqlCon.Open();
}
///設定SqlDataAdapter的屬性
SqlDataAdapter da = new SqlDataAdapter(procName,sqlCon);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
///添加預存程序參數
if(prams != null)
{
foreach(SqlParameter parameter in prams)
{
da.SelectCommand.Parameters.Add(parameter);
}
}
///添加返回參數
da.SelectCommand.Parameters.Add(new SqlParameter(returnValueString,
SqlDbType.Int,4,ParameterDirection.ReturnValue,
false,0,0,string.Empty,DataRowVersion.Default,null));
///返回SqlDataAdapter對象
return da;
}
/// <summary>
/// 防止SQL注入式攻擊
/// </summary>
/// <returns>返回整型資料</returns>
public static int checkLogin(string loginName, string loginPwd)
{
int result;
///建立資料庫連接
SqlConnection con = CreateSqlConnection();
SqlCommand myCommand = new SqlCommand("select count(*) from [User] where UserName=@loginName and Password=@loginPwd and RoleID=@RoleID", con);
myCommand.Parameters.Add(new SqlParameter("@loginName", SqlDbType.VarChar, 50));
myCommand.Parameters["@loginName"].Value = loginName;
myCommand.Parameters.Add(new SqlParameter("@loginPwd", SqlDbType.VarChar, 225));
myCommand.Parameters["@loginPwd"].Value = loginPwd;
myCommand.Parameters.Add(new SqlParameter("@RoleID", SqlDbType.Int));
myCommand.Parameters["@RoleID"].Value = 1;
myCommand.Connection.Open();
result = (int)myCommand.ExecuteScalar();
myCommand.Connection.Close();
return result;
}
#endregion
#region 管理串連
/// <summary>
/// 建立串連.
/// </summary>
private static SqlConnection CreateSqlConnection()
{ ///擷取連接字串
string conStr = (string)Cache.GetData(connectionStringNameInWebConfig);
if(string.IsNullOrEmpty(conStr))
{
try
{ ///如果連接字串為空白,則從設定檔中擷取連接字串
conStr = ConfigurationManager.ConnectionStrings[connectionStringNameInWebConfig].ConnectionString;
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
///把字串添加到緩衝中
Cache.CachingData(connectionStringNameInWebConfig,conStr);
}
if(!string.IsNullOrEmpty(conStr))
{ /// 建立資料庫連接
return(new SqlConnection(conStr));
}
return null;
}
#endregion
/// <summary>
/// 說明:GetDataSet資料集,返回資料來源的資料集
/// 傳回值:資料集DataSet
/// 參數:sQueryString SQL字串,TableName 資料表名稱
/// </summary>
public static DataSet GetDataSet(string sQueryString, string TableName)
{
///建立資料庫連接
SqlConnection con = CreateSqlConnection();
con.Open();
SqlDataAdapter dbAdapter = new SqlDataAdapter(sQueryString, con);
DataSet dataset = new DataSet();
dbAdapter.Fill(dataset, TableName);
con.Close();
return dataset;
}
#region 執行預存程序
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序的名稱</param>
/// <returns></returns>
public static int RunProc(string procName)
{ ///建立SqlCommand對象
SqlCommand cmd = CreateSqlCommand(procName,null);
if(cmd == null) return -1;
try
{ ///執行預存程序
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(cmd.Connection.State == ConnectionState.Open)
{
cmd.Connection.Close();
}
}
///返回執行結果
return (int)cmd.Parameters[returnValueString].Value;
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="prams">預存程序參數</param>
/// <returns></returns>
public static int RunProc(string procName,params SqlParameter[] prams)
{ ///建立SqlCommand對象
SqlCommand cmd = CreateSqlCommand(procName,prams);
if(cmd == null) return -1;
try
{ ///執行預存程序
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(cmd.Connection.State == ConnectionState.Open)
{
cmd.Connection.Close();
}
}
///返回執行結果
return (int)cmd.Parameters[returnValueString].Value;
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="dr">返回SqlDataReader對象</param>
public static void RunProc(string procName,out SqlDataReader dr)
{ ///建立SqlCommand對象
SqlCommand cmd = CreateSqlCommand(procName,null);
if(cmd == null)
{
dr = null;
return;
}
try
{ ///讀取資料
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(Exception ex)
{
dr = null;
throw new Exception(ex.Message,ex);
}
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="dr">返回SqlDataReader對象</param>
/// <param name="prams">預存程序參數</param>
public static void RunProc(string procName,out SqlDataReader dr,params SqlParameter[] prams)
{ ///建立SqlCommand對象
SqlCommand cmd = CreateSqlCommand(procName,prams);
if(cmd == null)
{
dr = null;
return;
}
try
{ ///讀取資料
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(Exception ex)
{
dr = null;
throw new Exception(ex.Message,ex);
}
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="ds">返回DataSet對象</param>
public static void RunProc(string procName,ref DataSet ds)
{ ///初始化ds
if(null == ds) ds = new DataSet();
///建立SqlDataAdapter
SqlDataAdapter da = CreateSqlDataAdapter(procName,null);
if(da == null) return;
try
{ ///填充資料
da.Fill(ds);
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(da.SelectCommand.Connection.State == ConnectionState.Open)
{
da.SelectCommand.Connection.Close();
}
}
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="ds">返回DataSet對象</param>
/// <param name="prams">預存程序參數</param>
public static void RunProc(string procName,ref DataSet ds,params SqlParameter[] prams)
{ ///初始化ds
if(null == ds) ds = new DataSet();
///建立SqlDataAdapter
SqlDataAdapter da = CreateSqlDataAdapter(procName,prams);
if(da == null) return;
try
{ ///填充資料
da.Fill(ds);
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(da.SelectCommand.Connection.State == ConnectionState.Open)
{
da.SelectCommand.Connection.Close();
}
}
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="ds">返回DataSet對象</param>
/// <param name="start">開始的記錄</param>
/// <param name="max">最大記錄數量</param>
public static void RunProc(string procName,ref DataSet ds,
int start,int max)
{ ///初始化ds
if(null == ds) ds = new DataSet();
///建立SqlDataAdapter
SqlDataAdapter da = CreateSqlDataAdapter(procName,null);
if(da == null) return;
try
{ ///填充資料
da.Fill(ds,start,max,"TableName");
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(da.SelectCommand.Connection.State == ConnectionState.Open)
{
da.SelectCommand.Connection.Close();
}
}
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="ds">返回DataSet對象</param>
/// <param name="start">開始的記錄</param>
/// <param name="max">最大記錄數量</param>
/// <param name="prams">預存程序參數</param>
public static void RunProc(string procName,ref DataSet ds,
int start,int max,params SqlParameter[] prams)
{ ///初始化ds
if(null == ds) ds = new DataSet();
///建立SqlDataAdapter
SqlDataAdapter da = CreateSqlDataAdapter(procName,prams);
if(da == null) return;
try
{ ///填充資料
da.Fill(ds,start,max,"TableName");
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(da.SelectCommand.Connection.State == ConnectionState.Open)
{
da.SelectCommand.Connection.Close();
}
}
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <returns>返回預存程序傳回值</returns>
public static int RunProcScalar(string procName)
{ ///建立SqlCommand對象
SqlCommand cmd = CreateSqlCommand(procName,null);
if(cmd == null) return -1;
int result;
try
{
///執行預存程序
result = (int)cmd.ExecuteScalar();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(cmd.Connection.State == ConnectionState.Open)
{
cmd.Connection.Close();
}
}
///返回查詢結果
return result;
}
/// <summary>
/// 執行預存程序
/// </summary>
/// <param name="procName">預存程序名稱</param>
/// <param name="prams">預存程序所需參數</param>
/// <returns>返回預存程序傳回值</returns>
public static int RunProcScalar(string procName,params SqlParameter[] prams)
{ ///建立SqlCommand對象
SqlCommand cmd = CreateSqlCommand(procName,prams);
if(cmd == null) return -1;
int result;
try
{
///執行預存程序
result = (int)cmd.ExecuteScalar();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ ///關閉串連
if(cmd.Connection.State == ConnectionState.Open)
{
cmd.Connection.Close();
}
}
///返回查詢結果
return result;
}
#endregion
}
internal class Cache
{
#region 快取資料
/// <summary>
/// 定義緩衝區
/// </summary>
private static Hashtable cache = Hashtable.Synchronized(new Hashtable());
/// <summary>
/// 快取資料到Cache中,如果已經存在快取項目,則重寫緩衝的資料。
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public static void CachingData(string key,object value)
{
cache[key] = value;
}
/// <summary>
/// 擷取緩衝的資料
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static object GetData(string key)
{
return (object)cache[key];
}
#endregion
}
}