using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Collections;
namespace CBAHotelDAL
{
public static class DBHelper
{
/// <summary>
/// 獲取配置文件中的連接字符串
/// </summary>
///
public static string ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
/// <summary>
/// 打開連接(如果之前未打開),並且創建一個可以立即執行的 SqlCommand 對象。
/// 該方法主要在 DBHelper 內部使用
/// </summary>
public static SqlCommand CreateCommand(string commandText, SqlConnection con)
{
if (con.State != ConnectionState.Open)
con.Open();
return new SqlCommand(commandText, con);
}
/// <summary>
/// 執行查詢(SELECT)語句。
/// </summary>
/// <param name="commandText">SELECT 語句</param>
/// <param name="con">連接對象。不需要事先打開(但要先實例化(new)),也不需要顯式關閉。</param>
/// <returns>包含查詢結果的 SqlDataReader 對象</returns>
public static SqlDataReader ExecuteReader(string commandText, SqlConnection con)
{
// 訂閱事件,用於調試連接狀態
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(commandText, con);
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
/// <summary>
/// 執行查詢(SELECT)存儲過程。
/// </summary>
/// <param name="procedureName">存儲過程</param>
/// <param name="con">連接對象。不需要事先打開(但要先實例化(new)),也不需要顯式關閉。</param>
/// <param name="parameters">存儲過程的參數</param>
/// <returns>包含查詢結果的 SqlDataReader 對象</returns>
public static SqlDataReader ExecuteReader(string procedureName, SqlConnection con, SqlParameter[] parameters)
{
// 訂閱事件,用於調試連接狀態
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(procedureName, con);
cmd.CommandType = CommandType.StoredProcedure;
if (parameters != null)
for (int i = 0; i < parameters.Length; i++)
cmd.Parameters.Add(parameters[i]);
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
/// <summary>
/// 執行增(INSERT)刪(DELETE)改(UPDATE)語句。
/// 這個方法自己會創建連接、打開連接並且自動關閉連接。
/// </summary>
/// <param name="commandText">SQL 語句</param>
public static void ExecuteNonQuery(string commandText)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
// 訂閱事件,用於調試連接狀態
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(commandText, con);
cmd.ExecuteNonQuery();
}
}
/// <summary>
/// 查詢返回單個值
/// </summary>
/// <param name="commandText"></param>
/// <returns></returns>
public static object ExecuteScalar(string commandText)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
con.StateChange+=new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(commandText, con);
return cmd.ExecuteScalar();
}
}
/// <summary>
/// 執行增(INSERT)刪(DELETE)改(UPDATE)存儲過程。
/// 這個方法自己會創建連接、打開連接並且自動關閉連接。
/// </summary>
/// <param name="procedureName">存儲過程名</param>
/// <param name="parameters">存儲過程的參數</param>
public static void ExecuteNonQuery(string procedureName, SqlParameter[] parameters)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
// 訂閱事件,用於調試連接狀態
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(procedureName, con);
cmd.CommandType = CommandType.StoredProcedure;
if (parameters != null)
for (int i = 0; i < parameters.Length; i++)
cmd.Parameters.Add(parameters[i]);
cmd.ExecuteNonQuery();
}
}
public static void ExecuteTransaction(ArrayList sqls, SqlTransaction sqlT)
{
using (SqlConnection con = new SqlConnection(DBHelper.ConnectionString))
{
con.Open();
sqlT = con.BeginTransaction(IsolationLevel.ReadCommitted);
SqlCommand cmd = con.CreateCommand();
cmd.Transaction = sqlT;
try
{
//循環事務中語句
foreach (string sVal in sqls)
{
cmd.CommandText = sVal;
cmd.ExecuteNonQuery();
}
//完成後確認事務
sqlT.Commit();
}
catch (Exception ex)
{
//出錯後回滾事務
sqlT.Rollback();
throw ex;
}
finally
{
con.Close();
}
}
}
/// <summary>
/// 這個方法用於調試連接狀態。
/// </summary>
static void con_StateChange(object sender, StateChangeEventArgs e)
{
SqlConnection conSender = sender as SqlConnection;
System.Diagnostics.Debug.WriteLine("連接狀態改變:" + e.OriginalState.ToString() + " => " + e.CurrentState.ToString());
}
}
}