using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Configuration;
using System.IO;
namespace DataAccess
{
public class Database : IDisposable
{
private SqlConnection connection;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 执行连锁的插入操作。
* 即利用插入语句sqlOne得到的ID作为后面插入语句的属性之一。
* 输入参数:
* sqlOne 执行的第一条SQL语句,
* pramsOne sqlOne语句对应的参数,
* sqls 连锁执行的SQL语句链表,
* prams 与sqls中每条SQL语句相对应的参数。
*
* sqls和prams示例:
* string sqlOne = "insert into T_User(...) values(...)"; // T_Userd的UserID自增。
* SqlParameter[] pramsOne = {...};
*
* int areaid = 123;
* // 注:与未知id对应的idvalue设置为@_ID_VALUE,此处UserID未知。
* string sql1 = "insert into T_UserArea(UserID, AreaID) values(@_ID_VALUE, @areaid)";
* SqlParameter[] pram1 =
* {
* null, // 注:与未知id对应参数设置为空。
* db.MakeInParam("@areaid", SqlDbType.Int, 4, areaid)
* };
* ......
*
* ArrayList arraySQL = new ArrayList();
* ArrayList arrayPram = new ArrayList();
* sqls.Add(sql1);
* prams.Add(pram1);
* .......
*
* int id = db.ExecuteReturnID(sqlOne, pramsOne, sqls, prams, "...methodName");
*
* 返 回 值: int --> 执行成功,返回执行第一条语句所插入的一条记录的ID值。
* --> 执行失败,返回-1。
*
*/
/// <summary>
/// 执行插入多个表的操作,第一个表(sqlOne)的主键为自动增长,若id=-1则插入失败
/// 利用插入语句sqlOne得到的ID作为后面插入语句的属性之一
///
/// sqls和prams示例:
/// string sqlOne = "insert into T_User(...) values(...)"; // T_Userd的UserID自增。
/// SqlParameter[] pramsOne = {...};
///
/// int areaid = 123;
/// // 注:与未知id对应的idvalue设置为@_ID_VALUE,此处UserID未知。
/// string sql1 = "insert into T_UserArea(UserID, AreaID) values(@_ID_VALUE, @areaid)";
/// SqlParameter[] pram1 =
/// {
/// null, // 注:与未知id对应参数设置为空。
/// db.MakeInParam("@areaid", SqlDbType.Int, 4, areaid)
/// };
/// ......
///
/// ArrayList arraySQL = new ArrayList();
/// ArrayList arrayPram = new ArrayList();
/// sqls.Add(sql1);
/// prams.Add(pram1);
/// .......
///
/// int id = db.ExecuteReturnID(sqlOne, pramsOne, sqls, prams, "...methodName");
///
/// </summary>
/// <param name="sqlOne">执行的第一条SQL语句</param>
/// <param name="pramsOne">sqlOne语句对应的参数</param>
/// <param name="sqls">连锁执行的SQL语句链表</param>
/// <param name="prams">与sqls中每条SQL语句相对应的参数</param>
/// <returns>
/// int --> 执行成功,返回执行第一条语句所插入的一条记录的ID值。
/// --> 执行失败,返回-1。
/// </returns>
public int ExecuteReturnID(string sqlOne, SqlParameter[] pramsOne, ArrayList sqls, ArrayList prams, string callMethodName)
{
int id = -1; // 初始化id值为-1
// 在第一条insert语句后加入select语句,以获得插入记录的ID值。
sqlOne += ";select CAST( SCOPE_IDENTITY() AS INT) ";
SqlCommand cmd = new SqlCommand();
try
{
this.Open();
cmd.Connection = this.connection;
cmd.CommandText = sqlOne;
for (int i = 0; i < pramsOne.Length; i++) // 插入对应参数。
{
cmd.Parameters.Add(pramsOne[i]);
}
cmd.Transaction = connection.BeginTransaction(); // 事务开始
id = (Int32)cmd.ExecuteScalar(); // 获得插入记录的ID。
// 若sqls和prams不为空,则执行其中的操作。
if (sqls != null && prams != null)
{
// 检查参数中SQL语句sqls和参数prams是否对应,不对应则不执行操作,返回-1。
if (sqls.Count != prams.Count)
{
cmd.Transaction.Rollback();
Common.WriteExceptionMessage(callMethodName + "-->ExecuteRetureID(...): sqls.Count != prams.Count");
return -1;
}
// 从sqls和prams中获得需执行的SQL语句和与之对应的参数,逐条执行。
for (int i = 0; i < sqls.Count; i++)
{
string sqlTwo = (string)sqls[i];
SqlParameter[] pramsTwo = (SqlParameter[])prams[i];
cmd.CommandText = sqlTwo;
for (int j = 0; j < pramsTwo.Length; j++)
{
// 未知ID在SQL中约定使用@_ID_VALUE代替其值。
// 写入的参数组中,与未知ID对应项参数项约定设置为null,
// 此处将为null的参数替换为执行第一条insert语句获得插入记录的ID。
if (pramsTwo[j] == null)
{
pramsTwo[j] = this.MakeInParam("@_ID_VALUE", SqlDbType.Int, 4, id.ToString());
}
cmd.Parameters.Add(pramsTwo[j]);
}
cmd.ExecuteNonQuery();
// 执行多条insert语句可能会有同名参数,因此执行完一条后清除cmd中的参数。
cmd.Parameters.Clear();
}
}
cmd.Transaction.Commit();
}
catch (Exception ex)
{
id = -1; // 出现异常后为id赋值为-1,操作失败。
cmd.Transaction.Rollback();
Common.WriteExceptionMessage(callMethodName + "-->ExecuteRetureID(string sqlOne, SqlParameter[] pramsOne, ArrayList sqls,ArrayList prams,string callMethodName)", ex);
}
finally
{
this.Close();
}
return id;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 构造函数
* 输入参数: 无
* 返 回 值: 无
*/
/// <summary>
/// 构造函数
/// </summary>
public Database()
{
try
{
if (connection == null)
{
connection = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings[0]);
}
}
catch(Exception ex)
{
Common.WriteExceptionMessage("DataAccess-->Database-->Database()", ex);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 打开数据库连接
* 输入参数: 无
* 返 回 值: 无
*/
/// <summary>
/// 打开数据库连接
/// </summary>
public void Open()
{
try
{
if (connection!=null && connection.State == ConnectionState.Closed)
{
connection.Open();
}
}catch(Exception ex)
{
Common.WriteExceptionMessage("DataAccess-->Database-->Open()", ex);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 关闭数据库连接
* 输入参数: 无
* 返 回 值: 无
*/
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
try
{
if (connection!=null && connection.State == ConnectionState.Open )
{
connection.Close();
}
}
catch(Exception ex)
{
Common.WriteExceptionMessage("DataAccess-->Database-->Close()", ex);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 释放数据库连接
* 输入参数: 无
* 返 回 值: 无
*/
/// <summary>
/// 释放数据库连接
/// </summary>
public void Dispose()
{
if (connection != null)
{
connection.Dispose();
connection = null;
}
}
//***************************************执行SQL语句 开始*********************************************
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 执行不带参数的SQL语句:适应于update , delete ,add 三类SQL语句
* 输入参数:
* 返 回 值: bool
*/
/// <summary>
/// 执行不带参数的SQL语句:适应于update , delete ,add 三类SQL语句
/// </summary>
/// <param name="sql"></param>
/// <param name="callMethodName"></param>
/// <returns>bool</returns>
public bool ExecuteNonQuery(string sql, string callMethodName)
{
bool result = true;
try
{
this.Open();
SqlCommand command = new SqlCommand(sql, connection);
command.ExecuteNonQuery();
}
catch (Exception ex)
{
result = false;
Common.WriteExceptionMessage(callMethodName + "-->ExecuteNonQuery", ex);
}
finally
{
this.Close();
}
return result;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 执行带有参数SQL语句:适应于update , delete ,add 三类SQL语句
* 输入参数:
* 返 回 值: bool
*/
/// <summary>
/// 执行带有参数SQL语句:适应于update , delete ,add 三类SQL语句
/// </summary>
/// <param name="sql"></param>
/// <param name="prams"></param>
/// <param name="callMethodName"></param>
/// <returns>bool</returns>
public bool ExecuteNonQuery(string sql, SqlParameter[] prams,string callMethodName)
{
bool result = true;
try
{
this.Open();
SqlCommand command=this.CreateCommandForSQL(sql, prams);
command.ExecuteNonQuery();
}
catch (Exception ex)
{
result = false;
Common.WriteExceptionMessage(callMethodName+"-->ExecuteNonQuery", ex);
}
finally
{
this.Close();
}
return result;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 执行不带参数的查询SQL语句
* 输入参数: sql-->sql语句;
* 返 回 值: dataTable-->返回的数据表
*/
/// <summary>
/// 执行不带参数的查询SQL语句
/// </summary>
/// <param name="sql"></param>
/// <param name="callMethodName"></param>
/// <returns>dataTable-->返回的数据表</returns>
public DataTable ExecuteQuery(string sql,string callMethodName)
{
SqlDataReader dataReader = null;
DataTable dataTable = new DataTable();
try
{
SqlCommand cmd = CreateCommandForSQL(sql, null);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);//System.Data.CommandBehavior.CloseConnection意味着:在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。
dataTable = Common.ConvertDataReaderToDataTable(dataReader);
}
catch (Exception ex)
{
dataTable = null;
Common.WriteExceptionMessage(callMethodName + "-->ExecuteQuery", ex);
}
finally
{
if (dataReader != null)
{
dataReader.Close();
}
}
return dataTable;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 执行带有参数的查询SQL语句
* 输入参数: sql-->sql语句;
* 返 回 值: dataTable-->返回的数据表
*/
/// <summary>
/// 执行带有参数的查询SQL语句
/// </summary>
/// <param name="sql"></param>
/// <param name="prams"></param>
/// <param name="callMethodName"></param>
/// <returns>dataTable-->返回的数据表</returns>
public DataTable ExecuteQuery(string sql, SqlParameter[] prams, string callMethodName)
{
SqlDataReader dataReader = null;
DataTable dataTable = new DataTable();
try
{
SqlCommand cmd = CreateCommandForSQL(sql, prams);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
dataTable = Business.Common.ConvertDataReaderToDataTable(dataReader);
}
catch (Exception ex)
{
dataTable = null;
Common.WriteExceptionMessage(callMethodName + "-->ExecuteQuery", ex);
}
finally
{
if (dataReader != null)
{
dataReader.Close();
}
}
return dataTable;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 执行一组不带参数的SQL语句
* 输入参数: sqlStrings:一组SQL语句
* 返 回 值: bool
*/
/// <summary>
/// 执行一组不带参数的SQL语句
/// </summary>
/// <param name="SqlStrings"></param>
/// <param name="callMethodName"></param>
/// <returns>bool</returns>
public bool ExecuteNonQuerySQLS(ArrayList SqlStrings,String callMethodName)
{
bool result = true;
this.Open();
SqlCommand cmd = new SqlCommand();
SqlTransaction trans = connection.BeginTransaction();
cmd.Connection = connection;
cmd.Transaction = trans;
try
{
foreach (String sql in SqlStrings)
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
trans.Commit();
}
catch (Exception ex)
{
result = false;
trans.Rollback();
Common.WriteExceptionMessage(callMethodName + "-->ExecuteNonQuerySQLS(ArrayList SqlStrings)", ex);
}
finally
{
this.Close();
}
return result;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 执行一组带有参数的SQL语句
* 输入参数: sqlStrings:一组SQL语句
* 返 回 值: bool
*/
/// <summary>
/// 执行一组带有参数的SQL语句
/// </summary>
/// <param name="SqlStrings"></param>
/// <param name="prams"></param>
/// <param name="callMethodName"></param>
/// <returns>bool</returns>
public bool ExecuteNonQuerySQLS(ArrayList SqlStrings,ArrayList prams, String callMethodName)
{
bool result = true;
this.Open();
SqlCommand cmd = new SqlCommand();
SqlTransaction trans = connection.BeginTransaction();
cmd.Connection = connection;
cmd.Transaction = trans;
try
{
int sqlCount = SqlStrings.Count;
for (int i = 0; i < sqlCount; i++)
{
//生成cmd
cmd.CommandText = (string)SqlStrings[i];
if (prams[i] != null)
{
foreach (SqlParameter parameter in (SqlParameter[])prams[i])
cmd.Parameters.Add(parameter);
}
cmd.Parameters.Add(
new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null));
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
trans.Commit();
}
catch (Exception ex)
{
result = false;
trans.Rollback();
Common.WriteExceptionMessage(callMethodName + "-->ExecuteNonQuerySQLS(ArrayList SqlStrings,ArrayList prams, String callMethodName)", ex);
}
finally
{
this.Close();
}
return result;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 创建Sqlcommand对象
* 输入参数:
* 返 回 值: Sqlcommand-->Sqlcommand对象
*/
/// <summary>
/// 创建Sqlcommand对象
/// </summary>
/// <param name="sql"></param>
/// <param name="prams"></param>
/// <returns>qlcommand-->Sqlcommand对象</returns>
private SqlCommand CreateCommandForSQL(string sql, SqlParameter[] prams)
{
this.Open();
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.CommandType = CommandType.Text;
if (prams != null)
{
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
}
cmd.Parameters.Add(
new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null));
return cmd;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 创建输入类型的参数
* 输入参数: ParamName-->参数名;DbType-->参数类型;Size-->参数大小;Value-->参数值
* 返 回 值: SqlParamter对象
*/
/// <summary>
/// 创建输入类型的参数
/// </summary>
/// <param name="ParamName"></param>
/// <param name="DbType"></param>
/// <param name="Size"></param>
/// <param name="Value"></param>
/// <returns>SqlParamter对象</returns>
public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 创建输出类型的参数
* 输入参数: ParamName-->参数名;DbType-->参数类型;Size-->参数大小;Value-->参数值
* 返 回 值: SqlParamter对象
*/
/// <summary>
/// 创建输出类型的参数
/// </summary>
/// <param name="ParamName"></param>
/// <param name="DbType"></param>
/// <param name="Size"></param>
/// <returns>SqlParamter对象</returns>
public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 描 述: 创建参数
* 输入参数: ParamName-->参数名;DbType-->参数类型;Size-->参数大小;Direction-->参数方向;Value-->参数值
* 返 回 值: SqlParamter对象
*/
/// <summary>
/// 创建参数
/// </summary>
/// <param name="ParamName"></param>
/// <param name="DbType"></param>
/// <param name="Size"></param>
/// <param name="Direction"></param>
/// <param name="Value"></param>
/// <returns>SqlParamter对象</returns>
public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
{
SqlParameter param;
if (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;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
#region IDisposable 成员
/// <summary>
///
/// </summary>
void IDisposable.Dispose()
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
}