自己认为访问数据库比较好的方式供大家参考,若大家有更好的方式可以一起学习。
首先要完成数据库访问的接口IDBAccess:
#region 数据库访问接口
/// <summary>
/// 名称: IDBAccess
/// 功能: 数据库访问接口
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// </summary>
public interface IDBAccess
{
#region 打开数据库连接
/// <summary>
/// 打开数据库连接
/// </summary>
/// <returns>打开数据库连接是否成功。true:打开成功;false:打开失败</returns>
bool OpenConnection();
#endregion
#region 关闭数据库连接
/// <summary>
/// 关闭数据库连接
/// </summary>
/// <returns>关闭数据库连接是否成功。true:关闭成功;false:关闭失败</returns>
bool CloseConnection();
#endregion
#region 执行命令字符串返回影响的行数(适合于执行Update、Delete和Insert T_SQL语句)
/// <summary>
/// 执行命令字符串返回影响的行数(适合于执行Update、Delete和Insert T_SQL语句)
/// </summary>
/// <param name="commandText">要执行的T_SQL语句字符串</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>执行命令字符串后影响的行数</returns>
int ExecuteNonQueryByText(string commandText, IDataParameter[] paraList);
#endregion
#region 执行命令字符串返回数据读取器(DataReader,适合于执行Select T_SQL语句)
/// <summary>
/// 执行命令字符串返回数据读取器(DataReader,适合于执行Select T_SQL语句)
/// </summary>
/// <param name="selectCommandText">要执行的T_SQL语句字符串</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>执行命令字符串后返回数据读取器</returns>
IDataReader ExecuteReaderByText(string selectCommandText, IDataParameter[] paraList);
#endregion
#region 执行命令字符串返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL语句)
/// <summary>
/// 执行命令字符串返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL语句)
/// </summary>
/// <param name="selectCommandText">要执行Select语句中包含聚合函数的T_SQL语句字符串</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>执行命令字符串后返回首行首列的值</returns>
object ExecuteScalarByText(string selectCommandText, IDataParameter[] paraList);
#endregion
#region 执行存储过程返回影响的行数(适合于执行Update、Delete和Insert T_SQL存储过程)
/// <summary>
/// 执行存储过程返回影响的行数(适合于执行Update、Delete和Insert T_SQL存储过程)
/// </summary>
/// <param name="procName">要执行的T_SQL语句的存储过程名称</param>
/// <param name="paraList">T_SQL语句存储过程中所代的参数数组(无参数是paraList为null)</param>
/// <returns>执行存储过程后影响的行数</returns>
int ExecuteNonQueryByProc(string procName, IDataParameter[] paraList);
#endregion
#region 执行存储过程返回数据读取器(DataReader,适合于执行Select T_SQL存储过程)
/// <summary>
/// 执行存储过程返回数据读取器(DataReader,适合于执行Select T_SQL语句)
/// </summary>
/// <param name="selectProcName">要执行的T_SQL存储过程名</param>
/// <param name="paraList">T_SQL存储过程中所代的参数数组(无参数是paraList为null)</param>
/// <returns>执行存储过程后返回数据读取器</returns>
IDataReader ExecuteReaderByProc(string selectProcName, IDataParameter[] paraList);
#endregion
#region 执行存储过程返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL存储过程)
/// <summary>
/// 执行存储过程返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL存储过程)
/// </summary>
/// <param name="selectProcName">要执行Select语句中包含聚合函数的T_SQL语句存储过程名</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>执行命令字符串后返回首行首列的值</returns>
object ExecuteScalarByProc(string selectProcName, IDataParameter[] paraList);
#endregion
#region 执行命令字符串返回数据记录集(DataTable)
/// <summary>
/// 执行命令字符串返回数据记录集(DataTable)
/// </summary>
/// <param name="selectCommandText">要执行Select语句中包含聚合函数的T_SQL语句字符串</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>数据记录集(DataTable)</returns>
DataTable ExecuteDataTableByText(string selectCommandText, IDataParameter[] paraList);
#endregion
#region 执行存储过程返回数据记录集(DataTable)
/// <summary>
/// 执行存储过程返回数据记录集(DataTable)
/// </summary>
/// <param name="selectProcName">要执行Select语句中包含聚合函数的T_SQL语句存储过程名</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>数据记录集(DataTable)</returns>
DataTable ExecuteDataTableByProc(string selectProcName, IDataParameter[] paraList);
#endregion
}
#endregion
其次实现数据库访问类,DBAccess从IDBAccess接口派生而来。另外,为了使类能够以任何形式访问数据库,故使用了泛型。
#region 数据库访问类(从IDBAccess接口派生出来)
/// <summary>
/// 名称: DBAccess<DBConnection, DBCommand, DBDataAdapter>
/// 功能: 数据库访问类(从IDBAccess接口派生出来)
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// <typeparam name="DBConnection">数据库连接数据类型</typeparam>
/// <typeparam name="DBCommand">数据库命令数据类型</typeparam>
/// <typeparam name="DBDataAdapter">数据库数据适配器数据类型</typeparam>
class DBAccess<DBConnection, DBCommand, DBDataAdapter> : IDBAccess
where DBConnection : System.Data.IDbConnection, new()
where DBCommand : System.Data.IDbCommand, new()
where DBDataAdapter : System.Data.IDbDataAdapter, new()
{
private DBConnection connection;
public DBAccess(string connectionString)
{
this.connection = new DBConnection();
this.connection.ConnectionString = connectionString;
}
#region IDBAccess 成员
public bool OpenConnection()
{
bool bIsSucceed = true;
try
{
if (this.connection.State != ConnectionState.Open)
{
this.connection.Open();
}
}
catch (Exception exp)
{
bIsSucceed = false;
throw new Exception("打开数据库失败!信息:" + exp.Message);
}
return bIsSucceed;
}
public bool CloseConnection()
{
bool bIsSucceed = true;
try
{
if (this.connection.State != ConnectionState.Closed)
{
this.connection.Close();
}
}
catch (Exception exp)
{
bIsSucceed = false;
throw new Exception("关闭数据库失败!信息:" + exp.Message);
}
return bIsSucceed;
}
private DBCommand CreateCommand(string commandText, CommandType type, IDataParameter[] paraList)
{
DBCommand command = default(DBCommand);
try
{
command = new DBCommand();
command.CommandText = commandText;
command.CommandType = type;
command.Connection = this.connection;
if (paraList != null)
{
foreach (IDataParameter para in paraList)
{
command.Parameters.Add(para);
}
}
}
catch (Exception exp)
{
throw new Exception("创建数据库操作的命令对象失败!信息:" + exp.Message);
}
return command;
}
public int ExecuteNonQueryByText(string commandText, IDataParameter[] paraList)
{
int rowCount = 0;
try
{
DBCommand command = CreateCommand(commandText, CommandType.Text, paraList);
OpenConnection();
rowCount = command.ExecuteNonQuery();
}
catch (Exception exp)
{
throw new Exception("执行命令字符串返回影响的行数失败!信息:" + exp.Message);
}
finally
{
CloseConnection();
}
return rowCount;
}
public IDataReader ExecuteReaderByText(string selectCommandText, IDataParameter[] paraList)
{
IDataReader dataReader = null;
try
{
DBCommand command = CreateCommand(selectCommandText, CommandType.Text, paraList);
OpenConnection();
dataReader = command.ExecuteReader();
}
catch (Exception exp)
{
CloseConnection();
throw new Exception("执行命令字符串返回数据读取器失败!信息:" + exp.Message);
}
return dataReader;
}
public object ExecuteScalarByText(string selectCommandText, IDataParameter[] paraList)
{
object obj = null;
try
{
DBCommand command = CreateCommand(selectCommandText, CommandType.Text, paraList);
OpenConnection();
obj = command.ExecuteScalar();
}
catch (Exception exp)
{
throw new Exception("执行命令字符串返回首行首列失败!信息:" + exp.Message);
}
finally
{
CloseConnection();
}
return obj;
}
public int ExecuteNonQueryByProc(string procName, IDataParameter[] paraList)
{
int rowCount = 0;
try
{
DBCommand command = CreateCommand(procName, CommandType.StoredProcedure, paraList);
OpenConnection();
rowCount = command.ExecuteNonQuery();
}
catch (Exception exp)
{
throw new Exception("执行存储过程返回影响的行数失败!信息:" + exp.Message);
}
finally
{
CloseConnection();
}
return rowCount;
}
public IDataReader ExecuteReaderByProc(string selectProcName, IDataParameter[] paraList)
{
IDataReader dataReader = null;
try
{
DBCommand command = CreateCommand(selectProcName, CommandType.StoredProcedure, paraList);
OpenConnection();
dataReader = command.ExecuteReader();
}
catch (Exception exp)
{
CloseConnection();
throw new Exception("执行存储过程返回数据读取器失败!信息:" + exp.Message);
}
return dataReader;
}
public object ExecuteScalarByProc(string selectProcName, IDataParameter[] paraList)
{
object obj = null;
try
{
DBCommand command = CreateCommand(selectProcName, CommandType.StoredProcedure, paraList);
OpenConnection();
obj = command.ExecuteScalar();
}
catch (Exception exp)
{
throw new Exception("执行存储过程返回首行首列失败!信息:" + exp.Message);
}
finally
{
CloseConnection();
}
return obj;
}
#endregion
#region 执行命令字符串返回数据记录集(DataTable)
/// <summary>
/// 执行命令字符串返回数据记录集(DataTable)
/// </summary>
/// <param name="selectCommandText">要执行Select语句中包含聚合函数的T_SQL语句字符串</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>数据记录集(DataTable)</returns>
public DataTable ExecuteDataTableByText(string selectCommandText, IDataParameter[] paraList)
{
DataSet ds = new DataSet();
try
{
DBCommand command = CreateCommand(selectCommandText, CommandType.Text, paraList);
DBDataAdapter da = new DBDataAdapter();
da.SelectCommand = command;
da.Fill(ds);
}
catch (Exception exp)
{
throw new Exception("执行命令字符串返回数据记录集异常!信息:" + exp.Message);
}
finally
{
CloseConnection();
}
return ds.Tables[0];
}
#endregion
#region 执行存储过程返回数据记录集(DataTable)
/// <summary>
/// 执行存储过程返回数据记录集(DataTable)
/// </summary>
/// <param name="selectProcName">要执行Select语句中包含聚合函数的T_SQL语句存储过程名</param>
/// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
/// <returns>数据记录集(DataTable)</returns>
public DataTable ExecuteDataTableByProc(string selectProcName, IDataParameter[] paraList)
{
DataSet ds = new DataSet();
try
{
DBCommand command = CreateCommand(selectProcName, CommandType.StoredProcedure, paraList);
DBDataAdapter da = new DBDataAdapter();
da.SelectCommand = command;
da.Fill(ds);
}
catch (Exception exp)
{
throw new Exception("执行存储过程返回数据记录集!信息:" + exp.Message);
}
finally
{
CloseConnection();
}
return ds.Tables[0];
}
#endregion
}
#endregion
接着要实现数据库访问的形式的枚举:
#region 访问数据库类型的枚举
/// <summary>
/// 名称: DBAccessType
/// 功能: 访问数据库类型的枚举
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// </summary>
public enum DBAccessType
{
Sql, // 以Sql形式访问数据库
Odbc, // 以Odbc形式访问数据库
OleDb, // 以OleDb形式访问数据库
Oracle // 以Oracle形式访问数据库
}
#endregion
最后实现数据库访问的工厂:
#region 数据库访问工厂类
/// <summary>
/// 名称: DBAccessFactory
/// 功能: 数据库访问工厂类
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// </summary>
public class DBAccessFactory
{
#region 获取数据库访问对象
/// <summary>
/// 获取数据库访问对象
/// </summary>
/// <param name="type">数据库访问的形式</param>
/// <param name="connectionString">访问数据库的连接字符串</param>
/// <returns>数据库访问对象</returns>
public static IDBAccess GetDBAccess(DBAccessType type, string connectionString)
{
IDBAccess dbAccess = null;
switch (type)
{
case DBAccessType.Sql:
dbAccess = new DBAccess<SqlConnection, SqlCommand, SqlDataAdapter>(connectionString);
break;
case DBAccessType.Odbc:
dbAccess = new DBAccess<OdbcConnection, OdbcCommand, OdbcDataAdapter>(connectionString);
break;
case DBAccessType.OleDb:
dbAccess = new DBAccess<OleDbConnection, OleDbCommand, OleDbDataAdapter>(connectionString);
break;
case DBAccessType.Oracle:
dbAccess = new DBAccess<OracleConnection, OracleCommand, OracleDataAdapter>(connectionString);
break;
default:
break;
}
return dbAccess;
}
#endregion
}
#endregion