using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace DMO.Utility
{
/// <summary>
///
/// </summary>
public static class SQLHelper
{
#region
/// <summary>
/// 获取配置文件中的连接字符串
/// </summary>
public static readonly string ConnectionString =
System.Configuration.ConfigurationManager.ConnectionStrings["DB"].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;
}
#endregion
/// <summary>
/// 执行查询(SELECT)语句或存储过程。
/// </summary>
/// <param name="commandText">要执行的语句或存储过程名称</param>
/// <param name="con">连接对象。不需要事先打开(但要先实例化(new)),也不需要显式关闭。</param>
/// <param name="commandType">System.Data.CommandType 值之一。指定要执行的 commandText 是表示语句还是存储过程名称。</param>
/// <param name="parameters">语句或存储过程的参数。</param>
/// <returns>用于读取查询结果的 SqlDataReader 对象</returns>
public static SqlDataReader ExecuteReader(string commandText, SqlConnection con, CommandType commandType, params SqlParameter[] parameters)
{
// 订阅事件,用于调试连接状态
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(commandText, con);
cmd.CommandType = commandType;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
/// <summary>
/// 执行增(INSERT)删(DELETE)改(UPDATE)语句或存储过程。
/// 这个方法自己会创建连接(由 DBHelper.ConnectionString 指定)、打开连接并且自动关闭连接。
/// </summary>
/// <param name="commandText">要执行的语句或存储过程名称</param>
/// <param name="commandType">System.Data.CommandType 值之一。指定要执行的 commandText 是表示语句还是存储过程名称。</param>
/// <param name="parameters">语句或存储过程的参数。</param>
public static void ExecuteNonQuery(string commandText, CommandType commandType, params SqlParameter[] parameters)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
// 订阅事件,用于调试连接状态
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(commandText, con);
cmd.CommandType = commandType;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cmd.ExecuteNonQuery();
}
}
#region
/// <summary>
/// 在事务中执行增(INSERT)删(DELETE)改(UPDATE)语句或存储过程。
/// 这个方法可以自动打开连接(由 DBHelper.ConnectionString 指定),
/// 但是不会自动关闭连接或更改事务状态。
/// 所使用的事务必须是已经启动的。
/// 无论是否发生异常,该方法都不会提交或回滚事务,以便于调用者自已控制事务的状态。
/// </summary>
/// <param name="commandText">语句或存储过程名</param>
/// <param name="commandType">System.Data.CommandType 值之一。指定要执行的 commandText 是表示语句还是存储过程名称。</param>
/// <param name="transaction">已经启动的事务对象</param>
/// <param name="parameters">语句或存储过程的参数</param>
public static void ExecuteNonQuery(string commandText, CommandType commandType, SqlTransaction transaction, params SqlParameter[] parameters)
{
SqlCommand cmd = CreateCommand(commandText, transaction.Connection);
cmd.Transaction = transaction;
cmd.CommandType = commandType;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cmd.ExecuteNonQuery();
}
/// <summary>
/// 执行一个存储过程,并且返回存储过程的返回值。
/// 存储过程中必须包含 RETURN 语句,否则方法返回 null。
/// </summary>
/// <param name="procedureName">存储过程名</param>
/// <param name="parameters">存储过程的参数</param>
/// <returns>如果存储过程无返回值或返回值为 null,则方法返回 null。否则方法返回存储过程的 RETURN 值。</returns>
public static object GetProcReturnValue(string procedureName, params SqlParameter[] parameters)
{
object obj = null;
using (SqlConnection con = new SqlConnection(ConnectionString))
{
SqlCommand cmd = CreateCommand(procedureName, con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter pReturnValue = cmd.CreateParameter();
pReturnValue.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(pReturnValue);
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cmd.ExecuteNonQuery();
obj = pReturnValue.Value;
}
return obj;
}
#endregion
/// <summary>
/// 执行一个存储过程,并且返回存储过程的返回值。
/// 存储过程中必须包含 RETURN 语句,否则方法返回 null。
/// </summary>
/// <param name="procedureName">存储过程名</param>
/// <returns>如果存储过程无返回值或返回值为 null,则方法返回 null。否则方法返回存储过程的 RETURN 值。</returns>
public static object GetProcReturnValue(string procedureName)
{
return GetProcReturnValue(procedureName, null);
}
#region
/// <summary>
/// 这个方法用于调试连接状态。
/// </summary>
private static void con_StateChange(object sender, StateChangeEventArgs e)
{
SqlConnection conSender = sender as SqlConnection;
System.Diagnostics.Debug.WriteLine("[" + conSender.GetHashCode() + "]:" + e.OriginalState.ToString() + " => " + e.CurrentState.ToString());
}
#endregion
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace DMO.Utility
{
/// <summary>
///
/// </summary>
public static class SQLHelper
{
#region
/// <summary>
/// 获取配置文件中的连接字符串
/// </summary>
public static readonly string ConnectionString =
System.Configuration.ConfigurationManager.ConnectionStrings["DB"].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;
}
#endregion
/// <summary>
/// 执行查询(SELECT)语句或存储过程。
/// </summary>
/// <param name="commandText">要执行的语句或存储过程名称</param>
/// <param name="con">连接对象。不需要事先打开(但要先实例化(new)),也不需要显式关闭。</param>
/// <param name="commandType">System.Data.CommandType 值之一。指定要执行的 commandText 是表示语句还是存储过程名称。</param>
/// <param name="parameters">语句或存储过程的参数。</param>
/// <returns>用于读取查询结果的 SqlDataReader 对象</returns>
public static SqlDataReader ExecuteReader(string commandText, SqlConnection con, CommandType commandType, params SqlParameter[] parameters)
{
// 订阅事件,用于调试连接状态
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(commandText, con);
cmd.CommandType = commandType;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
/// <summary>
/// 执行增(INSERT)删(DELETE)改(UPDATE)语句或存储过程。
/// 这个方法自己会创建连接(由 DBHelper.ConnectionString 指定)、打开连接并且自动关闭连接。
/// </summary>
/// <param name="commandText">要执行的语句或存储过程名称</param>
/// <param name="commandType">System.Data.CommandType 值之一。指定要执行的 commandText 是表示语句还是存储过程名称。</param>
/// <param name="parameters">语句或存储过程的参数。</param>
public static void ExecuteNonQuery(string commandText, CommandType commandType, params SqlParameter[] parameters)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
// 订阅事件,用于调试连接状态
con.StateChange += new StateChangeEventHandler(con_StateChange);
SqlCommand cmd = CreateCommand(commandText, con);
cmd.CommandType = commandType;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cmd.ExecuteNonQuery();
}
}
#region
/// <summary>
/// 在事务中执行增(INSERT)删(DELETE)改(UPDATE)语句或存储过程。
/// 这个方法可以自动打开连接(由 DBHelper.ConnectionString 指定),
/// 但是不会自动关闭连接或更改事务状态。
/// 所使用的事务必须是已经启动的。
/// 无论是否发生异常,该方法都不会提交或回滚事务,以便于调用者自已控制事务的状态。
/// </summary>
/// <param name="commandText">语句或存储过程名</param>
/// <param name="commandType">System.Data.CommandType 值之一。指定要执行的 commandText 是表示语句还是存储过程名称。</param>
/// <param name="transaction">已经启动的事务对象</param>
/// <param name="parameters">语句或存储过程的参数</param>
public static void ExecuteNonQuery(string commandText, CommandType commandType, SqlTransaction transaction, params SqlParameter[] parameters)
{
SqlCommand cmd = CreateCommand(commandText, transaction.Connection);
cmd.Transaction = transaction;
cmd.CommandType = commandType;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cmd.ExecuteNonQuery();
}
/// <summary>
/// 执行一个存储过程,并且返回存储过程的返回值。
/// 存储过程中必须包含 RETURN 语句,否则方法返回 null。
/// </summary>
/// <param name="procedureName">存储过程名</param>
/// <param name="parameters">存储过程的参数</param>
/// <returns>如果存储过程无返回值或返回值为 null,则方法返回 null。否则方法返回存储过程的 RETURN 值。</returns>
public static object GetProcReturnValue(string procedureName, params SqlParameter[] parameters)
{
object obj = null;
using (SqlConnection con = new SqlConnection(ConnectionString))
{
SqlCommand cmd = CreateCommand(procedureName, con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter pReturnValue = cmd.CreateParameter();
pReturnValue.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(pReturnValue);
if (parameters != null)
cmd.Parameters.AddRange(parameters);
cmd.ExecuteNonQuery();
obj = pReturnValue.Value;
}
return obj;
}
#endregion
/// <summary>
/// 执行一个存储过程,并且返回存储过程的返回值。
/// 存储过程中必须包含 RETURN 语句,否则方法返回 null。
/// </summary>
/// <param name="procedureName">存储过程名</param>
/// <returns>如果存储过程无返回值或返回值为 null,则方法返回 null。否则方法返回存储过程的 RETURN 值。</returns>
public static object GetProcReturnValue(string procedureName)
{
return GetProcReturnValue(procedureName, null);
}
#region
/// <summary>
/// 这个方法用于调试连接状态。
/// </summary>
private static void con_StateChange(object sender, StateChangeEventArgs e)
{
SqlConnection conSender = sender as SqlConnection;
System.Diagnostics.Debug.WriteLine("[" + conSender.GetHashCode() + "]:" + e.OriginalState.ToString() + " => " + e.CurrentState.ToString());
}
#endregion
}
}