俗话说“工欲善其事,必先利其器”,最近在做一个项目,为了省些事,索性把
以前的Framework重写了一次,没想到断断续续写了3个月之久。现在拿来出
来现现眼,请各位高手指正。

DataAccess是一个抽象基类,是其他数据访问类之母。以下正文。

using System;
using System.IO;
using System.Data;
using System.Diagnostics;

namespace TMT.Framework.Data
{
 
/// <summary>
 
/// 数据访问的抽象类:访问不同类型数据的抽象类
 
/// 所有访问数据相关的基类
 
/// </summary>

 public abstract class DataAccess
 
{
  
/// <summary>
  
/// 构造函数
  
/// 空
  
/// </summary>

  public DataAccess()
  
{
   
// Do nothing.
  }

  
  
/// <summary>
  
/// 得到DataSet的虚方法。
  
///  </summary>
  
/// <returns></returns>

  public virtual DataSet GetDataSet()
  
{
   
return new DataSet();
  }

  
  
/// <summary>
  
/// 得到DataTable的虚方法。
  
/// 不是必须实装。
  
/// </summary>
  
/// <returns></returns>

  public virtual DataTable GetDataTable()
  
{
   
return new DataTable();
  }

  
  
/// <summary>
  
/// 得到DataView的虚方法。
  
/// </summary>
  
/// <returns></returns>

  public virtual DataView GetDataView()
  
{
   
return new DataView();
  }

 }


 
/// <summary>
 
/// 数据访问类的异常类
 
/// </summary>

 public class DataAccessException : ApplicationException
 
{

  
/// <summary>
  
/// 构造函数
  
/// </summary>

  public DataAccessException()
  
{
  }


  
/// <summary>
  
/// 构造函数
  
/// </summary>
  
/// <param name="message">信息</param>

  public DataAccessException(string message) : base(message)
  
{
  }


     
/// <summary>
     
/// 构造函数
     
/// </summary>
     
/// <param name="message">消息</param>
     
/// <param name="ExInner">现在异常原因以外的异常</param>

  public DataAccessException(string message,Exception ExInner)
   : 
base(message,ExInner)
  
{
  }

 }

}


/* *****************************************************************************
 * Copyright (C) 2006 KBA All Right Reserved。                                                                     *
 * ***************************************************************************
*/





另外,正在做的这个项目打算做成开源的项目。

using System;
using System.Data;                      //for Dataset etc
using System.Data.SqlClient;            //for DataCommand etc..
using System.Configuration;             //for ConfigurationSettings

using TMT.Framework.Common;            //for Logger

namespace TMT.Framework.Data
{
 
/// <summary>
 
/// 数据访问类:DB访问类
 
/// 继承自DataAccess
 
/// 本类的目的
 
/// 1、DB访问方式的统一
 
/// 2、减少不良写入的风险
 
/// 3、提高整体Source的可读性
 
/// 4、减少DB访问关联的代码量
 
/// 5、隐藏各种DB访问对象(SqlConnection,SqlCommand,SqlDataAdapter,SqlTransaction,SqlParameter,
 
///    解除DB访问的混乱。
 
/// 6、数据容器:DataReader、DataSet等,在Class里没有实现,在子类实现。
 
///    DataReader没有必要用New声明(通过SqlCommand.ExectueReader()同样可以实现)。
 
/// </summary>

 public class DbAccess : DataAccess
 
{
  
//==============================================
  
// 连接型、非连接型共同使用的成员
  
//==============================================
  /// <summary>
  
/// 连接字符串
  
/// </summary>

  protected string          connectionString;
  
/// <summary>
  
/// Connection连接对象
  
/// </summary>

  private SqlConnection     sqlConnection;
  
/// <summary>
  
/// Command命令对象
  
/// </summary>

  private SqlCommand        sqlCommand;
  
/// <summary>
  
/// Tranction事务处理对象
  
/// </summary>

  private SqlTransaction    sqlTransaction;
  
/// <summary>
  
/// 在Transaction开始,连接打开了吗?
  
/// </summary>

  private bool              isConnectionOpenAtTransaction;

  
//==============================================
  
// 非连接类型使用的成员
  
//==============================================
  /// <summary>
  
/// DataAdapter
  
/// </summary>

  private SqlDataAdapter    sqlDataAdapter;
  
//----------------------------------------------
  /// <summary>
  
/// 连接重试次数
  
/// </summary>

  private int connectRetryNumber    =  1;
  
/// <summary>
  
/// 连接重试间隔(毫秒)
  
/// </summary>

  private int connectRetryInterval  =  5000;
  
//----------------------------------------------
  /// <summary>
  
/// 输入输出数据保存实体
  
/// </summary>

  private DataSet dsEntity  = null;
  
/// <summary>
  
/// 有无输出LOG(静态Static)
  
/// </summary>

  static private bool isLogOutput = false;

  
/// ============================================
  
/// 属性
  
/// ============================================
  
/// <summary>
  
/// 命令文本(字符串)Command Text
  
/// </summary>

  public string CommandText
  
{
   
get
   
{
    
if(sqlCommand != null)
    
{
     
return this.sqlCommand.CommandText;
    }

    
else
    
{
     
return "";
    }

   }

  }

  
/// <summary>
  
/// 连接重试次数(ConnectRetryNumber)
  
/// </summary>

  protected int ConnectRetryNumber
  
{
   
get
   
{
    
return connectRetryNumber;
   }

   
set
   
{
    connectRetryNumber 
= value;
   }

  }

  
/// <summary>
  
/// 连接重试间隔(毫秒)
  
/// </summary>

  protected int ConnectRetryInterval
  
{
   
get
   
{
    
return connectRetryInterval;
   }

   
set 
   
{
    connectRetryInterval 
= value;
   }

  }

  
/// <summary>
  
/// Log输出有无
  
/// </summary>

  static public void SetLogOutput(string isLogOutput)
  
{
   
if(isLogOutput.ToLower().Equals("true"))
   
{
    DbAccess.isLogOutput 
= true;
    Logger.Info(
null,"DbAccess.SetLogOutput(true)DB访问Log输出");
   }

   
else
   
{
    DbAccess.isLogOutput 
= false;
    Logger.Info(
null,"DvAccess.SetLogoutput(false)DB访问Log不输出");
   }

  }


  
/// <summary>
  
/// 构造函数
  
/// </summary>

  public DbAccess()
  
{
   
//成员变量初始化
   this.connectionString               = null;
   
this.sqlConnection                  = null;
   
this.sqlCommand                     = null;
   
this.sqlTransaction                 = null;
   
this.isConnectionOpenAtTransaction  = false;
   
this.sqlDataAdapter                 = null;
   
//初始化Class的成员
   this.Init();
  }


  
/// <summary>
  
/// 构造函数(指定超时)
  
/// </summary>
  
/// <param name="timeoutSeconds">超时时间(秒)</param>

  public DbAccess(string timeoutSeconds)
  
{
   
//成员变量初始化
   this.connectionString               = null;
   
this.sqlConnection                  = null;
   
this.sqlCommand                     = null;
   
this.sqlTransaction                 = null;
   
this.isConnectionOpenAtTransaction  = false;
   
this.sqlDataAdapter                 = null;

   
this.Init(timeoutSeconds);
  }


  
/// <summary>
  
/// 构造函数(指定超时)
  
/// </summary>
  
/// <param name="connectionString">连接字符串</param>
  
/// <param name="timeoutSeconds">超时时间(秒)</param>

  public DbAccess(string connectionString,string timeoutSeconds)
  
{
   
this.connectionString               = null;
   
this.sqlConnection                  = null;
   
this.sqlCommand                     = null;
   
this.sqlTransaction                 = null;
   
this.isConnectionOpenAtTransaction  = false;
   
this.sqlDataAdapter                 = null;

   
this.Init(connectionString,timeoutSeconds);
  }


  
/// <summary>
  
/// 构造函数(指定超时)
  
/// </summary>
  
/// <param name="connectionString">连接字符串</param>
  
/// <param name="timeoutSeconds">超时时间(秒)</param>
  
/// <param name="connectionRetryNumber">连接重试次数</param>
  
/// <param name="connectionRetryInterval">连接重试间隔</param>

  public DbAccess(string connectionString,string timeoutSeconds,int connectionRetryNumber,int connectionRetryInterval)
  
{
   
this.connectionString               = null;
   
this.sqlConnection                  = null;
   
this.sqlCommand                     = null;
   
this.sqlTransaction                 = null;
   
this.isConnectionOpenAtTransaction  = false;
   
this.sqlDataAdapter                 = null;

   
this.Init(connectionString,timeoutSeconds,connectionRetryNumber,connectionRetryInterval);
  }


  
/// <summary>
  
/// 初始化函数(不可用)
  
/// </summary>

  protected void Init()
  
{
   
//生成Connection
   this.sqlConnection = new SqlConnection(ConfigurationSettings.AppSettings["connectionString"]);
   
//生成SqlCommand
   
//作为SqlCommand,也可以作为SqlAdapeter的SqlCommand使用
   this.sqlCommand = new SqlCommand();
   
//关联SqlCommand和SqlConnection
   this.sqlCommand.Connection = this.sqlConnection;
   
throw new Exception("This method is not available.");
  }


  
/// <summary>
  
/// 初始化函数(不可用)
  
/// </summary>
  
/// <param name="timeoutSeconds">超时时间(秒)</param>

  protected void Init(string timeoutSeconds)
  
{
   
//连接字符串
   string connectionString = ConfigurationSettings.AppSettings["connectionStringWithTimeout"];
   
//生成连接
   this.sqlConnection = new SqlConnection(connectionString);
   
//生成SqlCommand
   
//作为SqlCommand,也可以作为SqlAdapeter的SqlCommand使用
   this.sqlCommand    = new SqlCommand();
   
//设置超时时间
   this.sqlCommand.CommandTimeout = Int32.Parse(timeoutSeconds);
   
//关联SqlCommand和SqlConnection
   this.sqlCommand.Connection = this.sqlConnection;

   
throw new Exception("This method is not available.");

  }


  
/// <summary>
  
///  初始化函数
  
/// </summary>
  
/// <param name="connectionString">连接字符串</param>
  
/// <param name="timeoutSeconds">超时时间(秒)</param>

  protected void Init(string connectionString,string timeoutSeconds)
  
{
   
//生成连接
   this.sqlConnection = new SqlConnection(connectionString);
   
//生成SqlCommand
   
//作为SqlCommand,也可以作为SqlAdapeter的SqlCommand使用
   this.sqlCommand    = new SqlCommand();
   
//设置超时时间
   this.sqlCommand.CommandTimeout = Int32.Parse(timeoutSeconds);
   
//关联SqlCommand和SqlConnection
   this.sqlCommand.Connection = this.sqlConnection;
  }


  
/// <summary>
  
/// 初始化函数
  
/// </summary>
  
/// <param name="connectionString">连接字符串</param>
  
/// <param name="timeoutSeconds">超时时间(秒)</param>
  
/// <param name="connectionRetryNumber">连接重试次数</param>
  
/// <param name="connectionRetryInterval">连接重试间隔</param>

  protected void Init(string connectionString,string timeoutSeconds,int connectionRetryNumber,int connectionRetryInterval)
  
{
   
//生成连接
   this.sqlConnection = new SqlConnection(connectionString);
   
//生成SqlCommand
   
//作为SqlCommand,也可以作为SqlAdapeter的SqlCommand使用
   this.sqlCommand    = new SqlCommand();
   
//设置超时时间
   this.sqlCommand.CommandTimeout = Int32.Parse(timeoutSeconds);
   
//设置重试次数
   this.ConnectRetryNumber   = connectionRetryNumber;
   
//设置重试间隔
   this.ConnectRetryInterval = connectionRetryInterval;
   
//关联SqlCommand和SqlConnection
   this.sqlCommand.Connection = this.sqlConnection;
  }


  
/// <summary>
  
/// 打开连接
  
/// </summary>
  
/// <returns>True:打开连接成功,False:没有打开连接</returns>

  public bool OpenConnection()
  
{
   
//如果Connection已经打开,do nothing
   if(this.sqlConnection != null && (this.sqlConnection.State != ConnectionState.Closed))
   
{
    
return false;
   }

   
//重试次数处理
   
//重试间隔处理
   for(int numberOfRetry = 0;numberOfRetry <= connectRetryNumber;numberOfRetry++)
   
{
    
try
    
{
     
//打开连接
     this.sqlConnection.Open();
    }

    
catch(SqlException sql_Exception)
    
{
     
//休眠
     System.Threading.Thread.Sleep(connectRetryInterval);
     
if(numberOfRetry == connectRetryNumber)
     
{
      
throw sql_Exception; 
     }

     
else
     
{
      
continue;
     }

    }

    
return true;
   }

   
return false;
  }

  
  
/// <summary>
  
/// 打开连接
  
/// </summary>
  
/// <param name="dsEntity">输入输出数据保存实体</param>
  
/// <returns>True:打开连接成功,False:没有打开连接</returns>

  public bool OpenConnection(DataSet dsEntity)
  
{
   
this.dsEntity = dsEntity;
   
//如果Connection已经打开,do nothing
   if(this.sqlConnection != null && (this.sqlConnection.State != ConnectionState.Closed))
   
{
    
return false;
   }

   
//重试次数处理
   
//重试间隔处理
   for(int numberOfRetry = 0;numberOfRetry <= connectRetryNumber;numberOfRetry++)
   
{
    
try
    
{
     
//打开连接
     this.sqlConnection.Open();
    }

    
catch(SqlException sql_exception)
    
{
     System.Threading.Thread.Sleep(connectRetryInterval);
     
if(numberOfRetry == connectRetryNumber)
     
{
      
throw sql_exception;
     }

     
else
     
{
      
continue;
     }

    }

    
return true;
   }

   
return false;
  }


  
/// <summary>
  
/// 关闭连接
  
/// </summary>

  public void CloseConnection()
  
{
   
if(this.sqlConnection != null && (this.sqlConnection.State != ConnectionState.Closed))
   
{
    
this.sqlConnection.Close();
   }

  }


  
/// <summary>
  
/// 生成数据适配器
  
/// </summary>

  private void CreateDataAdapter()
  
{
   
if(this.sqlDataAdapter == null)
   
{
    
this.sqlDataAdapter                          = new SqlDataAdapter();
    
this.sqlDataAdapter.SelectCommand            = this.sqlCommand;
    
this.sqlDataAdapter.SelectCommand.Connection = this.sqlConnection;
   }

  }


  
/// <summary>
  
/// Insert/Update/Delete命令生成
  
///如果Update没有被设定的话,那么从Select文自动生成Insert/Update/Delete命令。
  
///※自动生成机能的限制
  
///  1、Dataset的Table行是从一个Table派生出来的。
  
///  2、在源Table,主键是被定义的。存在一个以上的列由唯一值。
  
///  3、Table名字不能使用下记情形
  
///     >>空格(Space)
  
///     >>句号(.)
  
///     >>关键字(引用字符)
  
///     >>英数字以外的文字
  
///     例外:如“dbo.table1”,这里的句号(.)用来修饰Table是可以的
  
/// </summary>

  private void BuildCommand()
  
{

   
//DataAdapter未生成后者Select命令未生成的情况下,命令不能自动生成,do nothing。
   if(this.sqlDataAdapter == null || this.sqlDataAdapter.SelectCommand == null)
   
{
    
return;
   }


            
//如果有一个Command没有被设定,更新各Command(Insert/Update/Delete)
   if(this.sqlDataAdapter.SelectCommand == null || 
    
this.sqlDataAdapter.InsertCommand == null || 
    
this.sqlDataAdapter.DeleteCommand == null)
   
{
    
//生成CommandBuiler
    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(this.sqlDataAdapter);
    
if(this.sqlDataAdapter.InsertCommand == null)
    
{
     
this.sqlDataAdapter.InsertCommand = commandBuilder.GetInsertCommand();
    }

    
if(this.sqlDataAdapter.UpdateCommand == null)
    
{
     
this.sqlDataAdapter.UpdateCommand = commandBuilder.GetUpdateCommand();
    }

    
if(this.sqlDataAdapter.DeleteCommand == null)
    
{
     
this.sqlDataAdapter.DeleteCommand = commandBuilder.GetDeleteCommand();
    }

   }

  }


  
/// <summary>
  
/// 开始事务处理(Transaction开始)
  
/// </summary>

  public void BeginTransaction()
  
{
   
//Insert/Update/Delete命令自动生成(如果没有)
   
//在事务处理中(Transaction中)不能自动生成
   this.BuildCommand();
   
//如果连接没打开,就马上打开
   this.isConnectionOpenAtTransaction = this.OpenConnection();
   
//Transaction开始
   this.sqlTransaction = this.sqlConnection.BeginTransaction();
   
//设置Command.Transaction属性
   if(this.sqlCommand != null)
   
{
    
if(this.sqlCommand.Transaction == null)
    
{
     
this.sqlCommand.Transaction = this.sqlTransaction;
    }

    
else
    
{
     
if(!this.sqlCommand.Transaction.Equals(this.sqlTransaction))
     
{
      
this.sqlCommand.Transaction = this.sqlTransaction;
     }

    }

   }

  }

  
  
/// <summary>
  
/// 开始事务处理(Transaction开始)
  
/// </summary>
  
/// <param name="isolationlevel">事务连接的锁定级别</param>

  public void BeginTransaction(System.Data.IsolationLevel isolationlevel)
  
{
   
//Insert/Update/Delete命令自动生成(如果没有)
   
//在事务处理中(Transaction中)不能自动生成
   this.BuildCommand();
   
//如果连接没打开,就马上打开
   this.isConnectionOpenAtTransaction = this.OpenConnection();
   
//Transaction开始
   this.sqlTransaction = this.sqlConnection.BeginTransaction(isolationlevel);
   
//设置Command.Transaction属性
   if(this.sqlCommand != null)
   
{
    
if(this.sqlCommand.Transaction == null)
    
{
     
this.sqlCommand.Transaction = this.sqlTransaction;
    }

    
else
    
{
     
if(!this.sqlCommand.Transaction.Equals(this.sqlTransaction))
     
{
      
this.sqlCommand.Transaction = this.sqlTransaction;
     }

    }

   }

  }


  
/// <summary>
  
/// 提交数据库事务(Commit)
  
/// </summary>

  public void Commit()
  
{
   
//如果Transaction没有,do nothing
   if(this.sqlTransaction == null)
   
{
    
return;
   }

   
this.sqlTransaction.Commit();
   
this.sqlTransaction = null;
   
//如果是在Transaction开始时打开的连接,那么现在关闭。
   if(this.isConnectionOpenAtTransaction == true)
   
{
    
this.CloseConnection();
    
this.isConnectionOpenAtTransaction = false;
   }

  }


  
/// <summary>
  
/// 事务回滚(Rollback)
  
/// </summary>

  public void Rollback()
  
{
   
//如果Transaction没有,do nothing
   if(this.sqlTransaction == null)
   
{
    
return;
   }

   
this.sqlTransaction.Rollback();
   
this.sqlTransaction = null;
   
//如果是在Transaction开始时打开的连接,那么现在关闭。
   if(this.isConnectionOpenAtTransaction == true)
   
{
    
this.CloseConnection();
    
this.isConnectionOpenAtTransaction = false;
   }

  }

  
  
/// <summary>
  
/// 命令设定
  
/// </summary>
  
/// <param name="commandText">命令文本</param>

  protected void SetCommand(string commandText)
  
{
   
//清空已经加载的命令参数
   this.sqlCommand.Parameters.Clear();
   
//设定命令文本
   this.sqlCommand.CommandText = commandText;
   
//Command类型设定
   if(this.CommandText.ToUpper().StartsWith("SELECT "|| 
    
this.CommandText.ToUpper().StartsWith("INSERT "|| 
    
this.CommandText.ToUpper().StartsWith("UPDATE "||
    
this.CommandText.ToUpper().StartsWith("DELETE "||
    
this.CommandText.ToUpper().StartsWith("EXEC "))
   
{
    
//文本类型Text
    this.sqlCommand.CommandType = CommandType.Text;
   }

   
else
   
{
    
//存储过程
    this.sqlCommand.CommandText = CommandType.StoredProcedure.ToString();;
   }

  }


  
/// <summary>
  
/// 命令设定
  
/// </summary>
  
/// <param name="commandText">命令文本</param>
  
/// <param name="commandType">命令类型</param>

  protected void SetCommand(string commandText,CommandType commandType)
  
{
   
//清空已经加载的命令参数
   this.sqlCommand.Parameters.Clear();
   
//设定命令文本
   this.sqlCommand.CommandText = commandText;
   
//设定命令类型
   this.sqlCommand .CommandType = commandType;
  }


  
/// <summary>
  
/// 加载命令参数
  
/// </summary>
  
/// <param name="parameterName">参数名</param>
  
/// <param name="sqlDbType">DB类型</param>
  
/// <param name="size">大小</param>
  
/// <param name="sourceColumn">Source列</param>

  protected void AddParam(string parameterName,SqlDbType sqlDbType,
                       
int size,string sourceColumn)
  
{
   
//加载参数
   this.sqlCommand.Parameters.Add(parameterName,sqlDbType,size,sourceColumn);
  }


  
/// <summary>
  
/// 加载命令参数
  
/// 参数方向是Input
  
/// </summary>
  
/// <param name="parameterName">参数名</param>
  
/// <param name="sqlDbType">DB类型</param>
  
/// <param name="size">大小</param>

  protected void AddParam(string parameterName,SqlDbType sqlDbType,int size)
  
{
   
//加载参数
   this.sqlCommand.Parameters.Add(parameterName,sqlDbType,size);
  }


  
/// <summary>
  
/// 加载命令参数
  
/// 参数方向是Input,值是Null
  
/// </summary>
  
/// <param name="parameterName">参数名</param>
  
/// <param name="sqlDbType">DB类型</param>

  protected void AddParam(string parameterName,SqlDbType sqlDbType)
  
{
   
//加载参数
   this.sqlCommand.Parameters.Add(parameterName,sqlDbType);
  }


  
/// <summary>
  
/// 加载命令参数
  
/// 参数方向是Input
  
/// </summary>
  
/// <param name="parameterName">参数名</param>
  
/// <param name="Value">参数值</param>

  protected void AddParam(string parameterName,object Value)
  
{
   
//加载参数
   this.sqlCommand.Parameters.Add(parameterName,Value);
  }


  
/// <summary>
  
/// 命令参数 方向设定
  
/// </summary>
  
/// <param name="strParamName">参数名</param>
  
/// <param name="parameterDirection">方向</param>

  protected void SetParamDirection(string strParamName,ParameterDirection parameterDirection)
  
{
   
if(this.sqlCommand.Parameters[strParamName] != null)
   
{
    
this.sqlCommand.Parameters[strParamName].Direction = parameterDirection;
   }

  }

  
  
/// <summary>
  
/// 命令参数 方向设定
  
/// </summary>
  
/// <param name="index">参数索引</param>
  
/// <param name="parameterDirection">方向</param>

  protected void SetParamDirection(int index,ParameterDirection parameterDirection)
  
{
   
if(this.sqlCommand.Parameters.Count >= index)
   
{
    
this.sqlCommand.Parameters[index].Direction = parameterDirection;
   }

  }


  
/// <summary>
  
/// 参数 值设定
  
/// </summary>
  
/// <param name="strParamName">参数名</param>
  
/// <param name="Value"></param>

  protected void SetParamValue(string strParamName,object Value)
  
{
   
if(this.sqlCommand.Parameters[strParamName] != null)
   
{
    
this.sqlCommand.Parameters[strParamName].Value = Value;
   }

  }


  
/// <summary>
  
/// 参数 值设定
  
/// </summary>
  
/// <param name="index">参数索引</param>
  
/// <param name="Value"></param>

  protected void SetParamValue(int index,object Value)
  
{
   
if(this.sqlCommand.Parameters.Count >= index)
   
{
    
this.sqlCommand.Parameters[index].Value = Value;
   }

  }


  
/// <summary>
  
/// 取得参数值
  
/// </summary>
  
/// <param name="strParamName">参数名</param>
  
/// <returns>参数值</returns>

  protected object GetParamValue(string strParamName)
  
{
   
if(this.sqlCommand.Parameters[strParamName] != null && 
    
this.sqlCommand.Parameters[strParamName].Value != DBNull.Value)
   
{
    
return this.sqlCommand.Parameters[strParamName].Value;
   }

   
else
   
{
    
return null;
   }

  }


  
/// <summary>
  
/// 取得参数值
  
/// </summary>
  
/// <param name="index">参数索引</param>
  
/// <returns>参数值</returns>

  protected object GetParamValue(int index)
  
{
   
if(this.sqlCommand.Parameters.Count >= index &&
    
this.sqlCommand.Parameters[index].Value != DBNull.Value)
   
{
    
return this.sqlCommand.Parameters[index].Value;
   }

   
else
   
{
    
return null;
   }

  }


  
/// <summary>
  
/// Update命令设定
  
/// </summary>
  
/// <param name="commandText">命令文本</param>

  protected void SetCommandUpdate(string commandText)
  
{
   
//如果没有数据适配器,那么生成
   this.CreateDataAdapter();

   
//Update命令生成
   this.sqlDataAdapter.UpdateCommand = new SqlCommand(commandText,this.sqlConnection);

  }


  
/// <summary>
  
/// 加载Update命令参数
  
/// 在使用Update()时,参数和DataSet内列名对应
  
/// 不打算更新的Paramter的sourceVersion指定未Original
  
/// </summary>
  
/// <param name="strParamName">参数名</param>
  
/// <param name="sqlDbType">DB类型</param>
  
/// <param name="size">大小</param>
  
/// <param name="strSourceColumn">源(Source)列</param>
  
/// <param name="sourceVersion">在读入时指定的DataRowVersion</param>

  protected void AddParamUpdate(string strParamName,SqlDbType sqlDbType,int iSize,string strSourceColumn,DataRowVersion sourceVersion)
  
{
   SqlParameter param 
= this.sqlDataAdapter.UpdateCommand.Parameters.Add(strParamName,sqlDbType,iSize,strSourceColumn);
   param.SourceVersion 
= sourceVersion;
  }


  
/// <summary>
  
/// Insert命令设定
  
/// </summary>
  
/// <param name="commandText">命令文本</param>

  protected void SetCommandInsert(string commandText)
  
{
   
//如果没有数据适配器,那么生成
   this.CreateDataAdapter();
   
//Insert命令生成
   this.sqlDataAdapter.InsertCommand = new SqlCommand(commandText,this.sqlConnection);
  }


  
/// <summary>
  
/// 加载Insert命令参数
  
/// 在使用Update()时,参数和DataSet内列名对应
  
/// </summary>
  
/// <param name="strParamName">参数名</param>
  
/// <param name="sqlDbType">DB类型</param>
  
/// <param name="size">大小</param>
  
/// <param name="strSourceColumn">源(Source)列</param>

  protected void AddParamInsert(string strParamName,SqlDbType sqlDbType,int iSize,string strSourceColumn)
  
{
   
this.sqlDataAdapter.InsertCommand.Parameters.Add(strParamName,sqlDbType,iSize,strSourceColumn);
  }


  
/// <summary>
  
/// Delete命令设定
  
/// </summary>
  
/// <param name="commandText">命令文本</param>

  protected void AddParamDatele(string commandText)
  
{
   
//如果没有数据适配器,那么生成
   this.CreateDataAdapter();
   
//Insert命令生成
   this.sqlDataAdapter.DeleteCommand = new SqlCommand(commandText,this.sqlConnection);
  }


  
/// <summary>
  
/// 加载Delete命令参数
  
/// 在使用Update()时,参数和DataSet内列名对应
  
/// </summary>
  
/// <param name="strParamName">参数名</param>
  
/// <param name="sqlDbType">DB类型</param>
  
/// <param name="size">大小</param>
  
/// <param name="strSourceColumn">源(Source)列</param>

  protected void AddParamDelete(string strParamName,SqlDbType sqlDbType,int iSize,string strSourceColumn)
  
{
   
this.sqlDataAdapter.DeleteCommand.Parameters.Add(strParamName,sqlDbType,iSize,strSourceColumn);
  }


  
/// <summary>
  
/// ExcuteReader
  
/// </summary>
  
/// <param name="behavior">命令执行时的行为</param>
  
/// <returns>命令返回值(DataReader)</returns>

  protected SqlDataReader ExecuteReader(CommandBehavior behavior)
  
{
   
//ExecuteReader自己Open,不必Close。
   
//因为DataReader是连接型,关闭后不能读取数据。
   SqlDataReader dataReader  = null;
   
try
   
{
    
//输出log4net日志文件
    if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteReader Start -- " + this.sqlCommand.CommandText);
    }

    dataReader 
= this.sqlCommand.ExecuteReader(behavior);
   }

   
catch(SqlException sqlexception)
   
{
    
throw sqlexception;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteReader End");
    }

   }

   
return dataReader;
  }


  
/// <summary>
  
/// ExecuteReader
  
/// </summary>
  
/// <returns>命令返回值(Datareader)</returns>

  protected SqlDataReader ExecuteReader()
  
{
   
return this.sqlCommand.ExecuteReader(CommandBehavior.Default);
  }


  
/// <summary>
  
/// ExecuteScalar
  
/// </summary>
  
/// <returns>命令返回值</returns>

  protected object ExecuteScalar()
  
{
   
object cell = null;
   
try
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteSaclar Start -- " + this.sqlCommand.CommandText);
    }

    cell 
= this.sqlCommand.ExecuteScalar();
   }

   
catch(SqlException sqlexception)
   
{
    
throw sqlexception;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteScaler End");
    }

   }

   
return cell;
  }


  
/// <summary>
  
/// ExecuteNonQuery
  
/// Command.ExecuteNonQuery的覆盖函数
  
/// </summary>
  
/// <returns>影响函数</returns>

  protected int ExecuteNonQuery()
  
{
   
int affectedRowNum = 0;
   
   
try
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteNonQuery Start -- " + this.sqlCommand.CommandText);
    }

    affectedRowNum 
= this.sqlCommand.ExecuteNonQuery();
   }

   
catch(SqlException sqlexception)
   
{
    
throw sqlexception;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteNonQuery End");
    }

   }

   
return affectedRowNum;
  }


  
/// <summary>
  
/// ExecuteNonQueryWithSkip
  
/// Command.ExecuteNonQuery的覆盖函数
  
/// </summary>
  
/// <returns>影响行数</returns>

  protected int ExecuteNonQueryWithSkip()
  
{
   
int affectedRowNum = 0;
   
try
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteNonQueryWithSkip Start -- " + this.sqlCommand.CommandText);
    }

    affectedRowNum 
= this.sqlCommand.ExecuteNonQuery();
   }

   
catch(SqlException sqlexception)
   
{
    
throw sqlexception;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB ExecuteNonQueryWithSkip End");
    }

   }

   
return affectedRowNum;
  }


  
/// <summary>
  
/// 填充DataSet Fill
  
/// SqlDataAdapter.Fill()的覆盖函数
  
/// </summary>
  
/// <param name="dataSet">将要填充的DataSet</param>
  
/// <param name="startRecord">开始行索引</param>
  
/// <param name="maxRecords">最大行数</param>
  
/// <param name="srcTable">填充Table名</param>
  
/// <returns>正常追加或更新的行数</returns>

  protected int Fill(DataSet dataSet,int startRecord,int maxRecords,string srcTable)
  
{
   
this.CreateDataAdapter();
   
int rowNum = 0;
   
try
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB Fill Start -- " + this.sqlCommand.CommandText);
    }

    rowNum 
= this.sqlDataAdapter.Fill(dataSet,startRecord,maxRecords,srcTable);
   }

   
catch(SqlException sqlexception)
   
{
    
throw sqlexception;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB Fill End");
    }

   }

   
return rowNum;
  }


  
/// <summary>
  
/// 填充DataSet Fill
  
/// SqlDataAdapter.Fill()的覆盖函数
  
/// </summary>
  
/// <param name="dataSet">将要填充的DataSet</param>
  
/// <param name="srcTable">填充Table名</param>
  
/// <returns>正常追加或更新的行数</returns>

  protected int Fill(DataSet dataSet,string srcTable)
  
{
   
return this.Fill(dataSet,0,0x7FFFFFFF,srcTable);
  }


  
/// <summary>
  
/// 填充DataSet Fill
  
/// SqlDataAdapter.Fill()的覆盖函数
  
/// </summary>
  
/// <param name="dataSet">将要填充的DataSet</param>
  
/// <returns>正常追加或更新的行数</returns>

  protected int Fill(DataSet dataSet)
  
{
   
this.CreateDataAdapter();
   
int rowNum = 0;
   
try
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB Fill Start -- " + this.sqlCommand.CommandText);
    }

    rowNum 
= this.sqlDataAdapter.Fill(dataSet);
   }

   
catch(SqlException sqlexception)
   
{
    
throw sqlexception;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB Fill End");
    }

   }

   
return rowNum;
  }

  
  
/// <summary>
  
/// 填充DataTable Fill
  
/// </summary>
  
/// <param name="dataTable">>将要填充的Table</param>
  
/// <returns>正常追加或更新的行数</returns>

  protected int Fill(DataTable dataTable)
  
{
   
this.CreateDataAdapter();
   
int rowNum;
   
try
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB Fill Start -- " + this.sqlCommand.CommandText);
    }

    rowNum 
= this.sqlDataAdapter.Fill(dataTable);
   }

   
catch(SqlException sqlexception)
   
{
    
throw sqlexception;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    
if(isLogOutput == true)
    
{
     Logger.Debug(dsEntity,
"DB Fill End");
    }

   }

   
return rowNum;
  }


  
/// <summary>
  
/// Update
  
/// SqlDataAdapter.Update()的覆盖函数
  
/// 反映DataSet内容到DB
  
/// 通过使用DataSet追加、删除、变更Record,全部使用Update方法
  
/// </summary>
  
/// <param name="dataSet">数据集</param>
  
/// <param name="srcTable">被填充的Table名</param>
  
/// <returns>正常追加/更新的行数</returns>

  protected int Update(DataSet dataSet,string srcTable)
  
{
   
int rowNum = 0;
   
if(this.sqlDataAdapter == null)
   
{
    
return rowNum;
   }

   
this.BuildCommand();
   
if(this.sqlTransaction == null)
   
{
    
this.sqlDataAdapter.UpdateCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.InsertCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.DeleteCommand.Transaction = this.sqlTransaction;
   }

   
try
   
{
    Logger.Debug(dsEntity,
"DB Update Start --" + this.sqlCommand.CommandText);
    rowNum 
= this.sqlDataAdapter.Update(dataSet,srcTable);
   }

   
catch(SqlException sqlException)
   
{
    
throw sqlException;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    Logger.Debug(dsEntity,
"DB Update End");
   }

   
return rowNum;
  }

  
/// <summary>
  
/// Update
  
/// SqlDataAdapter.Update()的覆盖函数
  
/// 反映DataSet内容到DB
  
/// 通过使用DataSet追加、删除、变更Record,全部使用Update方法
  
/// </summary>
  
/// <param name="dataTable">被填充的Table</param>
  
/// <returns>正常追加/更新的行数</returns>

  protected int Update(DataTable dataTable)
  
{
   
int rowNum = 0;
   
if(this.sqlDataAdapter == null)
   
{
    
return rowNum;
   }

   
this.BuildCommand();
   
if(this.sqlTransaction == null)
   
{
    
this.sqlDataAdapter.UpdateCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.InsertCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.DeleteCommand.Transaction = this.sqlTransaction;
   }

   
try
   
{
    Logger.Debug(dsEntity,
"DB Update Start --" + this.sqlCommand.CommandText);
    rowNum 
= this.sqlDataAdapter.Update(dataTable);
   }

   
catch(SqlException sqlException)
   
{
    
throw sqlException;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    Logger.Debug(dsEntity,
"DB Update End");
   }

   
return rowNum;
  }


  
/// <summary>
  
/// Update
  
/// SqlDataAdapter.Update()的覆盖函数
  
/// 反映DataSet内容到DB
  
/// 通过使用DataSet追加、删除、变更Record,全部使用Update方法
  
/// </summary>
  
/// <param name="dataRow">被填充的dataRow</param>
  
/// <returns>正常追加/更新的行数</returns>

  protected int Update(DataRow[] dataRow)
  
{
   
int rowNum = 0;
   
if(this.sqlDataAdapter == null)
   
{
    
return rowNum;
   }

   
this.BuildCommand();
   
if(this.sqlTransaction == null)
   
{
    
this.sqlDataAdapter.UpdateCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.InsertCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.DeleteCommand.Transaction = this.sqlTransaction;
   }

   
try
   
{
    Logger.Debug(dsEntity,
"DB Update Start --" + this.sqlCommand.CommandText);
    rowNum 
= this.sqlDataAdapter.Update(dataRow);
   }

   
catch(SqlException sqlException)
   
{
    
throw sqlException;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    Logger.Debug(dsEntity,
"DB Update End");
   }

   
return rowNum;
  }


  
/// <summary>
  
/// Update
  
/// SqlDataAdapter.Update()的覆盖函数
  
/// 反映DataSet内容到DB
  
/// 通过使用DataSet追加、删除、变更Record,全部使用Update方法
  
/// </summary>
  
/// <param name="dataSet">被填充的dataSet</param>
  
/// <returns>正常追加/更新的行数</returns>

  protected int Update(DataSet dataSet)
  
{
   
int rowNum = 0;
   
if(this.sqlDataAdapter == null)
   
{
    
return rowNum;
   }

   
this.BuildCommand();
   
if(this.sqlTransaction == null)
   
{
    
this.sqlDataAdapter.UpdateCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.InsertCommand.Transaction = this.sqlTransaction;
    
this.sqlDataAdapter.DeleteCommand.Transaction = this.sqlTransaction;
   }

   
try
   
{
    Logger.Debug(dsEntity,
"DB Update Start --" + this.sqlCommand.CommandText);
    rowNum 
= this.sqlDataAdapter.Update(dataSet);
   }

   
catch(SqlException sqlException)
   
{
    
throw sqlException;
   }

   
catch(Exception exception)
   
{
    
throw exception;
   }

   
finally
   
{
    Logger.Debug(dsEntity,
"DB Update End");
   }

   
return rowNum;
  }

 }


 
 
/// <summary>
 
/// DB访问异常
 
/// </summary>

 public class DbAccessException : DataAccessException
 
{
  
  
/// <summary>
  
/// 构造函数
  
/// </summary>

  public DbAccessException()
  
{
  }

  
  
/// <summary>
  
/// 构造函数
  
/// </summary>
  
/// <param name="message"></param>

  public DbAccessException(string message)
   :
base(message)
  
{
  }


  
/// <summary>
  
/// 构造函数
  
/// </summary>
  
/// <param name="message"></param>
  
/// <param name="inner"></param>

  public DbAccessException(string message,Exception inner)
   :
base(message,inner)
  
{
  }

 }

}


/* ****************************************************************************
 * Copyright (C) 2006 KBA All Right Reserved。                                                                      *
 * ***************************************************************************
*/



http://blog.csdn.net/qdzx2008/archive/2006/11/04/1365822.aspx
posted on 2007-03-14 13:00  mbskys  阅读(203)  评论(0)    收藏  举报