using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
namespace Common
{
///
/// 用于SQL Server数据库访问的帮助类
///
public class SQLHelperClass
{
private string _connectionString = "";
public string connectionString
{
get { return _connectionString; }
set { _connectionString =value; }
}
private SqlConnection _connection4Tran;
private SqlTransaction _transaction;
private readonly Queue _transactionTaskList;
///
/// 创建一个新的SQLHelper并指定连接字符串
///
public SQLHelperClass()
{
_transactionTaskList = new Queue();
}
/////
///// 创建一个新的SQLHelper并指定连接信息
/////
/////
/////
/////
/////
// SQLHelper(string server, string userID, string password, string database)
//{
// _transactionTaskList = new Queue();
// if (database == string.Empty)
// {
// _connectionString = "Data Source=" + server + ";User ID=" + userID + ";Password=" + password;
// }
// else
// {
// _connectionString = "Data Source=" + server + ";User ID=" + userID + ";Password=" + password + ";Initial Catalog=" + database;
// }
//}
///
/// 测试连接
///
///
public bool TestConnection()
{
try
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
connection.Close();
return true;
}
}
catch (Exception)
{
return false;
}
}
///
/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(1)
///
/// 要执行的SQL语句
///
public int ExecuteNonQuery(string sql)
{
return ExecuteNonQuery(sql, CommandType.Text, null);
}
///
/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(2)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
///
public int ExecuteNonQuery(string sql, CommandType commandType)
{
return ExecuteNonQuery(sql, commandType, null);
}
///
/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(3)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
/// 参数数组
///
public int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)
{
return ExecuteNonQuery(sql, commandType, parameters, false);
}
///
/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(4)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
/// 参数数组
/// 是否加入事务处理;如果为true,前提是必须使用BeginTransaction开始了一个事务,如果为false,不使用事务。
///
public int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters, bool joinTransaction)
{
int count = 0;
if (joinTransaction)
{
if (_transaction == null || _connection4Tran == null)
{
throw new Exception("事务未初始化!");
}
//using (var command = new SqlCommand(sql, _connection4Tran))
//{
// command.CommandType = commandType;
// if (parameters != null)
// {
// foreach (SqlParameter parameter in parameters)
// {
// command.Parameters.Add(parameter);
// }
// }
// command.Transaction = _transaction;
// count = command.ExecuteNonQuery();
//}
_transactionTaskList.Enqueue(new SqlTask(sql, commandType, parameters));
}
else
{
using (var connection = new SqlConnection(_connectionString))
{
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = commandType;
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
connection.Open();
count = command.ExecuteNonQuery();
}
}
}
return count;
}
///
/// SqlDataAdapter的Fill方法执行一个查询,并返回一个DataSet类型结果(1)
///
/// 要执行的SQL语句
///
public DataSet ExecuteDataSet(string sql)
{
return ExecuteDataSet(sql, CommandType.Text, null);
}
///
/// SqlDataAdapter的Fill方法执行一个查询,并返回一个DataSet类型结果(2)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
///
public DataSet ExecuteDataSet(string sql, CommandType commandType)
{
return ExecuteDataSet(sql, commandType, null);
}
///
/// SqlDataAdapter的Fill方法执行一个查询,并返回一个DataSet类型结果(3)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
/// 参数数组
///
public DataSet ExecuteDataSet(string sql, CommandType commandType, SqlParameter[] parameters)
{
var ds = new DataSet();
using (var connection = new SqlConnection(_connectionString))
{
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = commandType;
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
var adapter = new SqlDataAdapter(command);
adapter.Fill(ds);
command.Parameters.Clear();//将使用完之后的Command命令的Parameters集合清空
}
}
return ds;
}
///
/// SqlDataAdapter的Fill方法执行一个查询,并返回一个DataTable类型结果(1)
///
/// 要执行的SQL语句
///
public DataTable ExecuteDataTable(string sql)
{
return ExecuteDataTable(sql, CommandType.Text, null);
}
///
/// SqlDataAdapter的Fill方法执行一个查询,并返回一个DataTable类型结果(2)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
///
public DataTable ExecuteDataTable(string sql, CommandType commandType)
{
return ExecuteDataTable(sql, commandType, null);
}
///
/// SqlDataAdapter的Fill方法执行一个查询,并返回一个DataTable类型结果(3)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
/// 参数数组
///
public DataTable ExecuteDataTable(string sql, CommandType commandType, SqlParameter[] parameters)
{
var data = new DataTable();
using (var connection = new SqlConnection(_connectionString))
{
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = commandType;
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
var adapter = new SqlDataAdapter(command);
adapter.Fill(data);
command.Parameters.Clear();//将使用完之后的Command命令的Parameters集合清空
}
}
return data;
}
///
/// ExecuteReader执行一查询,返回一SqlDataReader对象实例(1)
///
/// 要执行的SQL语句
///
public SqlDataReader ExecuteReader(string sql)
{
return ExecuteReader(sql, CommandType.Text, null);
}
///
/// ExecuteReader执行一查询,返回一SqlDataReader对象实例(2)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
///
public SqlDataReader ExecuteReader(string sql, CommandType commandType)
{
return ExecuteReader(sql, commandType, null);
}
///
/// ExecuteReader执行一查询,返回一SqlDataReader对象实例(3)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
/// 参数数组
///
public SqlDataReader ExecuteReader(string sql, CommandType commandType, SqlParameter[] parameters)
{
var connection = new SqlConnection(_connectionString);
var command = new SqlCommand(sql, connection) { CommandType = commandType };
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
///
/// ExecuteScalar执行一查询,返回查询结果的第一行第一列(1)
///
/// 要执行的SQL语句
///
public Object ExecuteScalar(string sql)
{
return ExecuteScalar(sql, CommandType.Text, null);
}
///
/// ExecuteScalar执行一查询,返回查询结果的第一行第一列(2)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
///
public Object ExecuteScalar(string sql, CommandType commandType)
{
return ExecuteScalar(sql, commandType, null);
}
///
/// ExecuteScalar执行一查询,返回查询结果的第一行第一列(3)
///
/// 要执行的SQL语句
/// 要执行的查询类型(存储过程、SQL文本)
/// 参数数组
///
public Object ExecuteScalar(string sql, CommandType commandType, SqlParameter[] parameters)
{
object result;
using (var connection = new SqlConnection(_connectionString))
{
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = commandType;
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
connection.Open();
result = command.ExecuteScalar();
command.Parameters.Clear();//将使用完之后的Command命令的Parameters集合清空
}
}
return result;
}
///
/// 返回当前连接的数据库中所有由用户创建的数据表
///
///
public DataTable GetTables()
{
DataTable data;
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
data = connection.GetSchema("Tables");
}
return data;
}
///
/// 返回当前连接的数据库列表
///
///
public DataTable GetDatabases()
{
DataTable data;
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
data = connection.GetSchema("Databases");
}
return data;
}
///
/// 获取SQL Server服务器列表
///
///
public ArrayList GetServerList()
{
var arrayList = new ArrayList();
foreach (DataRow dr in System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources().Rows)
{
arrayList.Add(dr[0].ToString());
}
return arrayList;
}
///
/// 开始一个事务处理
///
/// 调用格式样例:
///
/// SQLHelper.BeginTransaction
/// SQLHelper.ExecuteNoneQuery(command1)
/// SQLHelper.ExecuteNoneQuery(command2)
/// SQLHelper.ExecuteNoneQuery(...)
/// SQLHelper.CommitTransaction
///
/// 在事务提交之前,可随时使用方法CancelTransaction取消事务;
/// 如果事务在提交的过程中发生错误,将自动回滚事务。
///
/// 事务隔离级别
public void BeginTransaction(IsolationLevel isolationLevel)
{
if ((_transaction != null) || (_connection4Tran != null))
{
throw new Exception("要开始一个新的事务,请先完成当前事务!");
}
_connection4Tran = new SqlConnection(_connectionString);
_connection4Tran.Open();
_transaction = _connection4Tran.BeginTransaction(isolationLevel);
_transactionTaskList.Clear();
}
///
/// 提交事务
///
public void CommitTransaction()
{
try
{
if (_transactionTaskList.Count > 0)
{
foreach (SqlTask sqlTask in _transactionTaskList)
{
using (var command = new SqlCommand(sqlTask.Text, _connection4Tran))
{
command.CommandType = sqlTask.CommandType;
if (sqlTask.Parameters != null)
{
foreach (SqlParameter parameter in sqlTask.Parameters)
{
command.Parameters.Add(parameter);
}
}
command.Transaction = _transaction;
command.ExecuteNonQuery();
}
}
}
_transaction.Commit();
}
catch (Exception)
{
_transaction.Rollback();
throw;
}
finally
{
if (_transaction != null)
{
_transaction.Dispose();
}
if (_connection4Tran != null)
{
_connection4Tran.Close();
}
if (_connection4Tran != null)
{
_connection4Tran.Dispose();
}
_transaction = null;
_connection4Tran = null;
_transactionTaskList.Clear();
}
}
///
/// 通过存储过程返回结果集方法
///
/// 存储过程名称
/// 参数组
/// 返回SqlDataReader数据结果集
public SqlDataReader GetReaderByProcedure(string procedureName, SqlParameter[] param)
{
SqlConnection conn = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand();
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = procedureName;
cmd.Parameters.AddRange(param);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
WritterError("执行 GetReaderByProcedure(string procedureName,SqlParameter[] param)出现异常:", ex.Message);
conn.Close();
throw;
}
}
///
/// 通过存储过程返回一个DataSet数据集
///
/// 存储过程名称
/// 存储过程所需参数
/// DataSet数据集
public DataSet GetDataSetByProcedure(string procedureName, SqlParameter[] param)
{
SqlConnection conn = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand(procedureName, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
try
{
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(param);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
catch (Exception ex)
{
//WritterError("执行GetTableByProcedure(string procedureName,SqlParameter[] param)出现异常:", ex.Message);
throw ex;
}
finally
{
conn.Close();
}
}
#region 错误信息写入日志
public void WritterError(string errorObjName, string exMessage)
{
FileStream fs = new FileStream("libraryError.log", FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(string.Format("{0}{1}", errorObjName, exMessage + GetServerTime()));
sw.Close();
fs.Close();
}
#endregion
#region 获取服务器时间
public DateTime GetServerTime()
{
return Convert.ToDateTime(ExecuteScalar("select getdate()"));
}
#endregion
///
/// 取消事务
///
public void CancelTransaction()
{
if (_transaction != null)
{
_transaction.Dispose();
}
if (_connection4Tran != null)
{
_connection4Tran.Close();
}
if (_connection4Tran != null)
{
_connection4Tran.Dispose();
}
_transaction = null;
_connection4Tran = null;
}
#region ICloneable 成员
//public object Clone()
//{
// return (new SQLHelper(_connectionString));
//}
#endregion
#region IDisposable 成员
//public void Dispose()
//{
// _connection4Tran = null;
// _transaction = null;
//}
#endregion
public class SqlTask
{
public string Text { get; private set; }
public CommandType CommandType { get; private set; }
public SqlParameter[] Parameters { get; private set; }
public SqlTask(string text, CommandType commandType, SqlParameter[] paras)
{
Text = text;
CommandType = commandType;
Parameters = paras;
}
}
}
}