/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:MSSQLServerDBTransaction.cs * 2.功能描述:SQL数据库带有事物的操作类 * 编辑履历: * 作者 日期 版本 修改内容 * 张国印 2014/09/01 1.00 新建 *******************************************************************************/ using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Text; namespace Dongke.IBOSS.PRD.Basics.DataAccess { /// /// 数据库带有事物的操作类 /// public class MSSQLServerDBTransaction : IDBTransaction { private SqlConnection m_SqlConnection; private SqlTransaction m_SqlTransaction; private ConnectionState m_ConnState; private string m_connStr; /// /// 事务是否自动提交 /// public bool m_AutoCommit = false; /// /// 忽略大小写 /// public bool IgnoreCase { get; set; } /// /// SQL执行限定超时 /// public bool IsCommandTimeout { get; set; } public MSSQLServerDBTransaction(string m_strConn) { try { m_connStr = m_strConn; } catch (Exception ex) { string strError = ex.Message + ex.Source; throw new Exception(strError, ex); } } #region IDBTransaction 成员 public IDbConnection DbConnection { get { return m_SqlConnection; } set { m_SqlConnection = (value as SqlConnection); } } public bool AutoCommit { get { return m_AutoCommit; } set { m_AutoCommit = value; } } public ConnectionState ConnState { get { return m_ConnState; } set { m_ConnState = value; } } public string ConnStr { get { return m_connStr; } } public ConnectionState Connect() { try { // 初始化连接 m_SqlConnection = new SqlConnection(m_connStr); m_SqlConnection.Open(); m_ConnState = m_SqlConnection.State; m_SqlTransaction = m_SqlConnection.BeginTransaction(IsolationLevel.ReadCommitted); } catch (Exception ex) { m_ConnState = ConnectionState.Closed; string strError = ex.Message + ex.Source; throw new Exception(strError, ex); } return m_ConnState; } public bool CreateTransaction() { bool blSucess = false; try { if (m_ConnState != ConnectionState.Open) Connect(); m_SqlTransaction = m_SqlConnection.BeginTransaction(IsolationLevel.ReadCommitted); blSucess = true; } catch (Exception ex) { string strError = ex.Message + ex.Source; throw new Exception(strError, ex); } return blSucess; } public ConnectionState Disconnect() { try { if (m_ConnState == ConnectionState.Open) m_SqlConnection.Close(); m_ConnState = m_SqlConnection.State; } catch (Exception ex) { m_ConnState = ConnectionState.Closed; string strError = ex.Message + ex.Source; throw new Exception(strError, ex); } return m_ConnState; } public void Commit() { try { m_SqlTransaction.Commit(); } catch (Exception ex) { string strError = ex.Message + ex.Source; throw new Exception(strError, ex); } } public void Rollback() { try { m_SqlTransaction.Rollback(); } catch (Exception ex) { string strError = ex.Message + ex.Source; throw new Exception(strError, ex); } } public void RollbackTo(string p_strcheckPoint) { //try //{ // m_SqlTransaction.Rollback(); //} //catch (Exception ex) //{ // string strError = ex.Message + ex.Source; // throw new Exception(strError, ex); //} m_SqlTransaction.Rollback(p_strcheckPoint); } public void SavePoint(string p_strcheckPoint) { //throw new Exception("不支持此方法!"); m_SqlTransaction.Save(p_strcheckPoint); } public int ExecuteNonQuery(string p_strCommand, IDataParameter[] p_Parameter) { return ExecuteNonQuery(p_strCommand, false, p_Parameter); } public int ExecuteNonQuery(string p_strCommand, bool p_procedure, IDataParameter[] p_Parameter) { int blReturn = 0; if (m_ConnState != ConnectionState.Open) Connect(); try { SqlCommand myCommand = new SqlCommand(p_strCommand, m_SqlConnection); if (p_Parameter != null) { myCommand.Parameters.AddRange(p_Parameter); } myCommand.Transaction = m_SqlTransaction; if (p_procedure) { myCommand.CommandType = CommandType.StoredProcedure; } else { myCommand.CommandType = CommandType.Text; } blReturn = myCommand.ExecuteNonQuery(); if (m_AutoCommit) Commit(); } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } return blReturn; } public int UpdateBlob(string p_strTable, string p_strColumn, byte[] p_blobData, string p_strWhere) { int intReturn = 0; string strCommand = "UPDATE " + p_strTable + " SET " + p_strColumn + " =@blobValue where " + p_strWhere; if (m_SqlConnection.State != ConnectionState.Open) Connect(); try { SqlCommand myCommand = new SqlCommand(strCommand, m_SqlConnection); myCommand.Transaction = m_SqlTransaction; SqlParameter aseParam = new SqlParameter("@blobValue", SqlDbType.Image); aseParam.Direction = ParameterDirection.InputOutput; aseParam.Value = p_blobData; myCommand.Parameters.Add(aseParam); intReturn = myCommand.ExecuteNonQuery(); if (m_AutoCommit) Commit(); intReturn = 1; } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + strCommand; throw new Exception(strError, ex); } return intReturn; } public DataSet GetSqlResultToDs(string p_strCommand, IDataParameter[] p_Parameter) { DataSet myDs = new DataSet(); if (m_SqlConnection.State != ConnectionState.Open) Connect(); try { SqlDataAdapter dataAdapter = new SqlDataAdapter(p_strCommand, m_SqlConnection); if (p_Parameter != null) { dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter); } dataAdapter.SelectCommand.Transaction = m_SqlTransaction; dataAdapter.SelectCommand.CommandTimeout = 120; //2012-2-21 张国印 增加 用于查询超时 dataAdapter.Fill(myDs); } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } return myDs; } public DataSet GetSqlResultToDs(string p_strCommand, string p_strName, IDataParameter[] p_Parameter) { DataSet myDs = new DataSet(); if (m_SqlConnection.State != ConnectionState.Open) Connect(); try { SqlDataAdapter dataAdapter = new SqlDataAdapter(p_strCommand, m_SqlConnection); if (p_Parameter != null) { dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter); } dataAdapter.SelectCommand.Transaction = m_SqlTransaction; dataAdapter.SelectCommand.CommandTimeout = 120; //2012-2-21 张国印 增加 用于查询超时 dataAdapter.Fill(myDs, p_strName); } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } return myDs; } public DataTable GetSqlResultToDt(string p_strCommand, IDataParameter[] p_Parameter) { //初始化结果集(DT) DataTable myDt = new DataTable(); if (m_SqlConnection.State != ConnectionState.Open) Connect(); try { //dataAdapte实例化 SqlDataAdapter dataAdapter = new SqlDataAdapter(p_strCommand, m_SqlConnection); if (p_Parameter != null) { dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter); } dataAdapter.SelectCommand.Transaction = m_SqlTransaction; dataAdapter.SelectCommand.CommandTimeout = 120; //2012-2-21 张国印 增加 用于查询超时 //填充数据集(DT) dataAdapter.Fill(myDt); } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } //返回数据集 return myDt; } public string GetSqlResultToStr(string p_strCommand, IDataParameter[] p_Parameter) { string strResult = ""; object retValue = null; if (m_ConnState != ConnectionState.Open) Connect(); try { SqlCommand oraCmd = new SqlCommand(p_strCommand, m_SqlConnection); if (p_Parameter != null) { oraCmd.Parameters.AddRange(p_Parameter); } oraCmd.Transaction = m_SqlTransaction; oraCmd.CommandTimeout = 120; //2012-2-21 张国印 增加 用于查询超时 retValue = oraCmd.ExecuteScalar(); if (retValue != null) strResult = retValue.ToString(); else strResult = String.Empty; } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } return strResult; } public object GetSqlResultToObj(string p_strCommand, IDataParameter[] p_Parameter) { object retValue = null; if (m_ConnState != ConnectionState.Open) Connect(); try { SqlCommand oraCmd = new SqlCommand(p_strCommand, m_SqlConnection); if (p_Parameter != null) { oraCmd.Parameters.AddRange(p_Parameter); } oraCmd.Transaction = m_SqlTransaction; oraCmd.CommandTimeout = 120; //2012-2-21 张国印 增加 用于查询超时 retValue = oraCmd.ExecuteScalar(); } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } return retValue; } public byte[] GetSqlResultToBt(string p_strCommand, IDataParameter[] p_Parameter) { int bufferSize = 100; byte[] bytData = new byte[bufferSize]; byte[] bytResult = null; int retval; int startIndex = 0; if (m_SqlConnection.State != ConnectionState.Open) Connect(); try { //创建内存流,用于将byte[]数组写入到流中 MemoryStream ms = new MemoryStream(); SqlCommand sqlCommand = new SqlCommand(p_strCommand, m_SqlConnection); if (p_Parameter != null) { sqlCommand.Parameters.AddRange(p_Parameter); } sqlCommand.Transaction = m_SqlTransaction; SqlDataReader myReader = sqlCommand.ExecuteReader(CommandBehavior.SequentialAccess); while (myReader.Read()) { //读取blob列数据到bytData中 retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize)); //将bytData写入到流中 ms.Write(bytData, 0, retval); while (retval == bufferSize) { // 重新设置读取bytData数据后缓冲读取位置的开始索引 startIndex += bufferSize; retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize)); ms.Write(bytData, 0, retval); } } bytResult = ms.ToArray(); ms.Close(); myReader.Close(); } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } return bytResult; } /// /// 执行存储过程 /// /// 存储过程名称 /// IDataParameter类型 参数集合 /// public DataSet ExecStoredProcedure(string p_strCommand, IDataParameter[] p_Parameter) { DataSet myDs = new DataSet(); if (m_SqlConnection.State != ConnectionState.Open) Connect(); try { SqlDataAdapter dataAdapter = new SqlDataAdapter(p_strCommand, m_SqlConnection); if (p_Parameter != null) { dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter); } dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure; dataAdapter.SelectCommand.Transaction = m_SqlTransaction; dataAdapter.SelectCommand.CommandTimeout = 120; //2012-2-21 张国印 增加 用于查询超时 dataAdapter.Fill(myDs); } catch (Exception ex) { string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + p_strCommand; throw new Exception(strError, ex); } return myDs; } #endregion } }