使用ADO.Net时,每次数据库操作都要设置connection属性、建立connection、使用command、事务处理等,比较繁琐,有很多重复工作。能不能把这些繁琐的、常用的操作再封装一下,以更方便、安全地使用。下面这个类就是一种尝试: using System; using System.Data.SqlClient; using System.Text; using System.Data; using System.Collections; using System.Configuration;
public class DBAccess { /// <summary> /// Declare the ole db required objects /// </summary>
/// <summary> /// An ole db adapter to act as the bridge to the database /// </summary> private SqlDataAdapter dbDataAdapter; /// <summary> /// The connection to the database /// </summary> private SqlConnection dbConnection; /// <summary> /// The command for doing the inserts /// </summary> private SqlCommand dbInsertCommand; /// <summary> /// The command for doing the deletes /// </summary> private SqlCommand dbDeleteCommand; /// <summary> /// The command for doing the updates /// </summary> private SqlCommand dbUpdateCommand; /// <summary> /// The command for doing the Selects /// </summary> private SqlCommand dbSelectCommand;
private SqlCommand dbSelectCommandofAdapter;
/// <summary> /// The command for get dataset /// </summary> private SqlDataAdapter dataAdapterCommand;
/// <summary> /// The data reader for the application /// </summary> public SqlDataReader dbDataReader;
/// <summary> /// Declare an enum to allow internal tracking of commands /// </summary> enum COMMAND{ NONE, INSERT, UPDATE, DELETE, SELECT,DATASET };
/// <summary> /// Internal member for tracking command progress /// </summary> private COMMAND command;
/// <summary> /// String to hold error messages if a command fails /// </summary> private string error;
/// <summary> /// Get a stored error message if ExecuteCommand fails /// </summary> public string ErrorMessage { get { return error; } }
/// <summary> /// bool holder for is open /// </summary> private bool bOpen;
/// <summary> /// Check to see if a data base is open /// </summary> public bool IsOpen { get { return bOpen; } }
/// <summary> /// Declare a string object for the insert command /// </summary> public string InsertCommand { get { return dbInsertCommand.CommandText; } set { command = COMMAND.INSERT; dbInsertCommand.CommandText = value; } }
/// <summary> /// Declare a string object for the delete command /// </summary> public string DeleteCommand { get { return dbDeleteCommand.CommandText; } set { command = COMMAND.DELETE; dbDeleteCommand.CommandText = value; } }
/// <summary> /// Declare a string object for the update command /// </summary> public string UpdateCommand { get { return dbUpdateCommand.CommandText; } set { command = COMMAND.UPDATE; dbUpdateCommand.CommandText = value; } }
/// <summary> /// Declare a string object for the select command /// </summary> public string SelectCommand { get { return dbSelectCommand.CommandText; } set { command = COMMAND.SELECT; dbSelectCommand.CommandText = value; } }
public string SelectDataSetCommand { get { return dataAdapterCommand.SelectCommand.CommandText; } set { command = COMMAND.DATASET; dataAdapterCommand.SelectCommand.CommandText = value; } }
/// <summary> /// Get the reader from the class /// </summary> public SqlDataReader GetReader { get { switch( command ) { case COMMAND.NONE: return null; case COMMAND.DELETE: return DeleteReader; case COMMAND.INSERT: return InsertReader; case COMMAND.SELECT: return SelectReader; case COMMAND.UPDATE: return UpdateReader; default: return null; } } }
public DataSet GetDataSet { get { switch( command ) { case COMMAND.DATASET: return SelectDataSet(); default: return null; } } }
public DataSet SelectDataSet() { try { dataAdapterCommand.SelectCommand.Connection = dbConnection; DataSet dataset = new DataSet(); dataAdapterCommand.Fill(dataset); return dataset; } catch (Exception exp) { error = exp.Message; return null; }
}
/// <summary> /// Execute the command that has been set up previously /// </summary> /// <returns>A boolean value indicating true or false</returns> public bool ExecuteCommand() { bool bReturn = false; if( command == COMMAND.NONE ) { return bReturn; } else if( command == COMMAND.SELECT ) { /// select only returns true as the get reader function will /// execute the command
try { if( dbDataReader != null ) { dbDataReader.Close(); dbDataReader = null; }
bReturn = true; /// return bReturn; } catch( SqlException exp ) { error = "dbException thrown when trying to Select, error given = " + exp.Message + " check the sql"; return bReturn = false; }
} else if( command == COMMAND.DATASET ) { return bReturn; } else { int nAffected = -1;
if( dbDataReader != null ) { dbDataReader.Close(); dbDataReader = null; }
/// get the transaction object from the connection SqlTransaction trans = dbConnection.BeginTransaction();
try { /// create a nested transaction on the connection transaction switch( command ) { case COMMAND.DELETE: dbDeleteCommand.Transaction = trans; break; case COMMAND.INSERT: dbInsertCommand.Transaction = trans; break; case COMMAND.UPDATE: dbUpdateCommand.Transaction = trans; break; }
/// execute the command switch( command ) { case COMMAND.DELETE: nAffected = dbDeleteCommand.ExecuteNonQuery(); break; case COMMAND.INSERT: nAffected = dbInsertCommand.ExecuteNonQuery(); break; case COMMAND.UPDATE: nAffected = dbUpdateCommand.ExecuteNonQuery(); break; }
} catch( InvalidOperationException ioexp ) { StringBuilder buildError = new StringBuilder(); buildError.Append( "InvalidOperationException thrown when trying to " );
switch( command ) { case COMMAND.DELETE: buildError.Append( "Delete" ); break; case COMMAND.INSERT: buildError.Append( "Insert" ); break; case COMMAND.UPDATE: buildError.Append( "Update" ); break; }
buildError.Append( ", error given = " + ioexp.Message + " check the sql" );
error = buildError.ToString();
return bReturn = false; } catch( SqlException dbexp ) { StringBuilder buildError = new StringBuilder(); buildError.Append( "InvalidOperationException thrown when trying to " );
switch( command ) { case COMMAND.DELETE: buildError.Append( "Delete" ); break; case COMMAND.INSERT: buildError.Append( "Insert" ); break; case COMMAND.UPDATE: buildError.Append( "Update" ); break; }
buildError.Append( ", error given = " + dbexp.Message + " check the sql" );
error = buildError.ToString();
return bReturn = false; } finally { /// commit the command if( nAffected == 1 ) { switch( command ) { case COMMAND.DELETE: dbDeleteCommand.Transaction.Commit(); break; case COMMAND.INSERT: dbInsertCommand.Transaction.Commit(); break; case COMMAND.UPDATE: dbUpdateCommand.Transaction.Commit(); break; }
//trans.Commit();
bReturn = true; } else /// if something went wrong rollback { switch( command ) { case COMMAND.DELETE: dbDeleteCommand.Transaction.Rollback(); break; case COMMAND.INSERT: dbInsertCommand.Transaction.Rollback(); break; case COMMAND.UPDATE: dbUpdateCommand.Transaction.Rollback(); break; }
//trans.Rollback();
bReturn = false; } } }
return bReturn; }
#region select functions
/// <summary> /// Get the Select reader from the select command /// </summary> private SqlDataReader SelectReader { get { if( dbDataReader != null ) { if( dbDataReader.IsClosed == false ) { dbDataReader.Close(); dbDataReader = null; } }
dbDataReader = dbSelectCommand.ExecuteReader(); return dbDataReader; } }
/// <summary> /// Get the Update reader from the update command /// </summary> private SqlDataReader UpdateReader { get { if( dbDataReader.IsClosed == false ) dbDataReader.Close();
dbDataReader = dbSelectCommand.ExecuteReader(); return dbDataReader; } }
/// <summary> /// Get the Insert Reader from the Insert Command /// </summary> private SqlDataReader InsertReader { get { if( dbDataReader.IsClosed == false ) dbDataReader.Close();
dbDataReader = dbSelectCommand.ExecuteReader(); return dbDataReader; } }
/// <summary> /// Get the Delete Reader from the Delete Command /// </summary> private SqlDataReader DeleteReader { get { if( dbDataReader != null ) { if( dbDataReader.IsClosed == false ) { dbDataReader.Close(); dbDataReader = null; } }
dbDataReader = dbSelectCommand.ExecuteReader(); return dbDataReader; } }
#endregion
/// <summary> /// Standard Constructor /// </summary> public DBAccess() { /// NOTE That we are not setting the commands up the way the wizard would /// but building them more generically
// create the command variables dbDataAdapter = new SqlDataAdapter(); dbConnection = new SqlConnection(); dbSelectCommand = new SqlCommand(); dbDeleteCommand = new SqlCommand(); dbUpdateCommand = new SqlCommand(); dbInsertCommand = new SqlCommand();
/// set up the adapter dbDataAdapter.DeleteCommand = dbDeleteCommand; dbDataAdapter.InsertCommand = dbInsertCommand; dbDataAdapter.SelectCommand = dbSelectCommand; dbDataAdapter.UpdateCommand = dbUpdateCommand;
/// make sure everyone knows what conection to use dbSelectCommand.Connection = dbConnection; dbDeleteCommand.Connection = dbConnection; dbUpdateCommand.Connection = dbConnection; dbInsertCommand.Connection = dbConnection;
command = COMMAND.NONE; dbDataReader = null;
dbSelectCommandofAdapter = new SqlCommand(); dataAdapterCommand = new SqlDataAdapter(); dataAdapterCommand.SelectCommand = dbSelectCommandofAdapter; }
public void Open() { /// set up the connection string StringBuilder strBuild = new StringBuilder();
//Connection的属性从配置文件读取 strBuild.AppendFormat(ConfigurationSettings.AppSettings["DBConnection"]);
dbConnection.ConnectionString = strBuild.ToString();
try { dbConnection.Open(); bOpen = true; } catch (Exception exp) { error = exp.Message; }
}
/// <summary> /// Close the currently open connection /// </summary> public void Close() { if (dbDataReader != null) { if( dbDataReader.IsClosed == false ) { dbDataReader.Close(); dbDataReader = null; } }
dbConnection.Close(); }
}
使用示例:
Insert操作,新建用户:
public bool NewUser() { DBAccess newUserDBAccess = new DBAccess(); StringBuilder sqlStr = new StringBuilder(); sqlStr.Append( "Insert into userTable(usrName,pwd,name,depart,role,available) values("); sqlStr.Append( "'" + usrName + "',"); sqlStr.Append( "'" + pwd + "',"); sqlStr.Append( "'" + name + "',"); sqlStr.Append( "'" + depart + "',"); sqlStr.Append( "'" + role + "',"); sqlStr.Append(1); sqlStr.Append( ")");
newUserDBAccess.InsertCommand = sqlStr.ToString(); newUserDBAccess.Open(); try { if (!newUserDBAccess.ExecuteCommand()) { errMsg = newUserDBAccess.ErrorMessage;
return false; } else { return true; } } finally { newUserDBAccess.Close(); }
}
Update操作,修改用户信息:
public bool ModifyUser() { DBAccess modifyUserDBAccess = new DBAccess(); StringBuilder sqlStr = new StringBuilder(); sqlStr.Append( "update userTable set "); sqlStr.Append( " usrName = "); sqlStr.Append( "'" + usrName + "',"); sqlStr.Append( " name ="); sqlStr.Append( "'" + name + "',"); sqlStr.Append( " pwd ="); sqlStr.Append( "'" + pwd + "',"); sqlStr.Append( " depart ="); sqlStr.Append( "'" + depart + "',"); sqlStr.Append( " role ="); sqlStr.Append( "'" + role + "'"); sqlStr.Append( " where usrID = "); sqlStr.Append(id);
modifyUserDBAccess.UpdateCommand = sqlStr.ToString(); modifyUserDBAccess.Open(); try { if (!modifyUserDBAccess.ExecuteCommand()) { errMsg = modifyUserDBAccess.ErrorMessage;
return false; } else { return true; } } finally { modifyUserDBAccess.Close(); }
}
Delete操作,删除用户: public static bool DelUser(int usrID) { DBAccess delUserDBAccess = new DBAccess(); StringBuilder sqlStr = new StringBuilder(); sqlStr.Append( "update userTable set "); sqlStr.Append( " available ="); sqlStr.Append(0); sqlStr.Append( " where usrID = "); sqlStr.Append(usrID);
delUserDBAccess.UpdateCommand = sqlStr.ToString(); delUserDBAccess.Open(); try { if (!delUserDBAccess.ExecuteCommand()) { return false; } else { return true; } } finally { delUserDBAccess.Close(); }
}
|