对数据库表进行简单的增删改查操作的通用类


// ==============================
// Author: ZhiQiao
// Date: 2008/09/16
// File: DbTable.cs
// ==============================
namespace Kenwood.Product.DataAccessHelper
{
using System;
using System.Xml;
using System.Data;
using System.Data.SqlClient;
/// <summary>
/// 数据库表。
/// 提供对数据库表的查询、添加、更新、删除操作,简化数据访问。
/// 使用该类需要建立配置文件 DbTableConfig.xml,存储数据库连接字符串及使用该类的表的 Select/Insert/Update/Delete 存储过程名称。
/// </summary>
public class DbTable
{
// 数据库连接字符串。
private string connectionString;
// 用于查询、插入、更新、删除操作的存储过程名称。
private string selectProcedureName;
private string insertProcedureName;
private string updateProcedureName;
private string deleteProcedureName;
// DataAccessHelper.StoreProcedure 对象用于简化存储过程调用。
private StoreProcedure storeProcedure;
// 数据库表在内存中的映射。
private DataTable table;
/// <summary>
/// 从配置文件中读取指定表的配置信息,初始化 DataAccessHelper.DbTable 对象。
/// </summary>
/// <param name="dbTableName">数据库表名称(带有数据库名作为前缀)。
/// 该名称是在配置文件中定义的,参数值格式 dataBaseName/TableName,例如:DataBase1/Table1。</param>
public DbTable(string dbTableName) {
XmlDocument doc = new XmlDocument();
doc.Load(Kenwood.Product.Properties.Settings.Default.DbTableConfigFile);
// 数据库名称。
string dbName = dbTableName.Substring(0, dbTableName.IndexOf('/'));
// 获取配置文件中的数据库连接字符串。
XmlNode connectionStringNode = doc.SelectSingleNode("//" + dbName + "/@connectionString");
this.connectionString = connectionStringNode.InnerText.Trim();
this.storeProcedure = new StoreProcedure(this.connectionString);
// 从配置文件中获取 Select 存储过程的名称。
XmlNode selectProcedureNameNode = doc.SelectSingleNode("//" + dbTableName + "/select/text()");
if (selectProcedureNameNode != null) {
this.selectProcedureName = selectProcedureNameNode.InnerText.Trim();
}
// 从配置文件中获取 Insert 存储过程的名称。
XmlNode insertProcedureNameNode = doc.SelectSingleNode("//" + dbTableName + "/insert/text()");
if (insertProcedureNameNode != null) {
this.insertProcedureName = insertProcedureNameNode.InnerText.Trim();
}
// 从配置文件中获取 Update 存储过程的名称。
XmlNode deleteProcedureNameNode = doc.SelectSingleNode("//" + dbTableName + "/delete/text()");
if (deleteProcedureNameNode != null) {
this.deleteProcedureName = deleteProcedureNameNode.InnerText.Trim();
}
// 从配置文件中获取 Delete 存储过程的名称。
XmlNode updateProcedureNameNode = doc.SelectSingleNode("//" + dbTableName + "/update/text()");
if (updateProcedureNameNode != null) {
this.updateProcedureName = updateProcedureNameNode.InnerText.Trim();
}
this.table = new DataTable(dbTableName);
}
/// <summary>
/// 获取数据库表由指定的 Select 存储过程查询的结果。
/// </summary>
public DataTable Table {
get { return this.table; }
}
/// <summary>
/// 查询数据。
/// </summary>
/// <param name="condition">SELECT 存储过程的 WHERE 条件。</param>
public void Select(string condition) {
this.storeProcedure.StoreProcedureName = this.selectProcedureName;
this.table.Clear();
this.storeProcedure.ExecuteFillDataTable(this.table, condition);
}
/// <summary>
/// 查询数据。
/// </summary>
public void Select() {
this.Select("1=1");
}
/// <summary>
/// 调用 Select 存储过程查询数据填充指定的表。确保 Select 存储过程返回了数据库表的所有字段。
/// 如果希望用存储过程对表执行汇总查询或部分字段查询请使用 DataAccessHelper.StoreProcedure 对象。
/// 如果指定的 Select 查询不能包含所有的数据库表字段,将有可能使得 Update() 方法无法正常调用。
/// </summary>
/// <param name="tableToFill">要填充的 System.Data.DataTable 对象。</param>
/// <param name="paraValues">传递给为该数据库表指定的 Select 存储过程的参数值列表。</param>
public void Fill(DataTable tableToFill, params object[] paraValues) {
this.storeProcedure.StoreProcedureName = this.selectProcedureName;
this.storeProcedure.ExecuteFillDataTable(tableToFill, paraValues);
}
/// <summary>
/// 向数据库表中插入一条新纪录。
/// </summary>
/// <param name="paraValues">传递给为该数据库表指定的 Insert 存储过程的参数值列表。</param>
/// <returns>受影响的行数。</returns>
public int Insert(params object[] paraValues) {
this.storeProcedure.StoreProcedureName = this.insertProcedureName;
return this.storeProcedure.ExecuteNonQuery(paraValues);
}
/// <summary>
/// 删除数据库表中的一条记录。
/// </summary>
/// <param name="paraValues">传递给为该数据库表指定的 Delete 存储过程的参数值列表。</param>
/// <returns>受影响的行数。</returns>
public int Delete(params object[] paraValues) {
this.storeProcedure.StoreProcedureName = this.deleteProcedureName;
return this.storeProcedure.ExecuteNonQuery(paraValues);
}
/// <summary>
/// 更新一条数据库记录。
/// </summary>
/// <param name="paraValues">传递给为该数据库表指定的 Update 存储过程的参数值列表。</param>
/// <returns>受影响的行数。</returns>
public int Update(params object[] paraValues) {
this.storeProcedure.StoreProcedureName = this.updateProcedureName;
return this.storeProcedure.ExecuteNonQuery(paraValues);
}
/// <summary>
/// 更新表。
/// </summary>
/// <returns>受影响的行数。</returns>
public int Update() {
SqlCommand insertCommand = PrepareSqlCommand(this.insertProcedureName);
SqlCommand updateCommand = PrepareSqlCommand(this.updateProcedureName);
SqlCommand deleteCommand = PrepareSqlCommand(this.deleteProcedureName);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.InsertCommand = insertCommand;
adapter.UpdateCommand = updateCommand;
adapter.DeleteCommand = deleteCommand;
// 禁用批量更新。
adapter.UpdateBatchSize = 1;
// 更新发生错误,将尝试更新其余的行。
adapter.ContinueUpdateOnError = true;
try {
int updatedRows = adapter.Update(table);
return updatedRows;
} catch {
throw;
}
}
//根据指定的存储过程名称创建 System.Data.SqlClient.SqlCommand 对象,并自动获取参数添加到
//System.Data.SqlClient.SqlCommand.Parameters 列表中,然后设置其与 Table 的列映射。
private SqlCommand PrepareSqlCommand(string storeProcedureName) {
SqlCommand command = null;
if (storeProcedureName != null) {
command = new SqlCommand(storeProcedureName, new SqlConnection(this.connectionString));
command.CommandType = CommandType.StoredProcedure;
this.storeProcedure.DeriveParameters(command);
this.SetSourceColumn(command);
}
return command;
}
// 设置存储过程参数与 Table 表的列映射。
private void SetSourceColumn(SqlCommand command) {
DataColumnCollection columns = this.table.Columns;
SqlParameterCollection parameters = command.Parameters;
int parametersCount = parameters.Count;
for (int i = 1; i < parametersCount; i++) {
parameters[i].SourceColumn = columns[parameters[i].ParameterName.Remove(0, 1)].ColumnName;
}
}
}
}
Xml 文件格式


<?xml version="1.0" encoding="utf-8" ?>
<DataBases>
<SKE_Product connectionString="Data Source=ZHIQIAONB\SQLEXPRESS;Initial Catalog=SKE_Product;Integrated Security=True">
<T_TableName>
<select>usp_TableName_Select</select>
<delete>usp_TableName_Delete</delete>
<insert>usp_TableName_Insert</insert>
<update>usp_TableName_Update</update>
</T_User>
</SKE_Product>
</DataBases>