TableBase

/**
 * 所有单个表的添加,修改,删除,查询操作的类
 */
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;

namespace SysUtility
{
 /// <summary>
 /// 所有单个表的添加,修改,删除,查询操作。
 /// 该类封装所有这些操作。
 /// 所有的单个表的操作都可以通过该类来完成。
 /// 该类的每一个公有方法都有可能抛出SqlException。
 /// <remarks>
 ///  该类的目标是当表的结构发生变化时该类无需变化。
 /// </remarks>
 /// </summary>
 public sealed class TableBase
 {
  #region Private

  /// <summary>
  /// 数据库连接字符串
  /// </summary>
  private string sqlConnString;
  /// <summary>
  /// 要处理的表名
  /// </summary>
  private string tableName;

  #endregion

  #region   Constructors

  /// <summary>
  /// 构造函数,初始化TableBase类的新实例。
  /// </summary>
  /// <param name="talbeName">数据库表名</param>
  /// <param name="connString">数据库连接字符串</param>
  public TableBase(string talbeName, string connString)
  {
   this.tableName = talbeName;
   this.sqlConnString = connString;
  }

  #endregion

  #region INSERT 该函数向表中插入一条记录

  /// <summary>
  /// 该函数向数据库表中插入一条记录。
  /// 要插入的数据为一个哈希表。
  ///  其中:哈希表中的每一个键值为数据库表中的对应的列名,键所对应的对象即为列对应的值。
  /// 该函数处理的SQL语句类型为:INSERT INTO TableName (columnList) VALUES (parameterList)
  /// </summary>
  /// <param name="data">要插入的数据</param>
  /// <returns>返回受影响的行数</returns>
  public int Insert(Hashtable data)
  {
   if(data==null && data==new Hashtable())
   {
    throw new Exception("无插入数据!");
   }
   int cnts = -1;
   // 创建到数据库的连接以及数据库命令
   SqlConnection sqlConn = new SqlConnection(sqlConnString);
   SqlCommand sqlCmd = new SqlCommand();
   sqlCmd.Connection = sqlConn;
   sqlCmd.CommandType = CommandType.Text;

   // 创建插入命令SQL语句所需的列名列表和参数列表,设置每个参数的名字和值
   string columnList = "";
   string parameterList = "";
   string parameterName = "";
   foreach (string columnName in data.Keys)
   {
    parameterName = "@" + columnName.Replace("[","").Replace("]","");
    columnList += columnName + ",";
    parameterList += parameterName + ",";

    sqlCmd.Parameters.Add(parameterName, data[columnName]);
   }

   // 去除列名列表和参数列表中最后的逗号字符
   columnList = columnList.Substring(0, columnList.Length - 1);
   parameterList = parameterList.Substring(0, parameterList.Length - 1);

   // 组装完整的插入命令SQL语句,设置命令对象的文本属性
   string insertSql = "INSERT INTO " + tableName + "(" + columnList + ") VALUES (" + parameterList + ")";
   sqlCmd.CommandText = insertSql;
   // 打开连接并执行数据库命令
   try
   {
    sqlConn.Open();
    cnts = sqlCmd.ExecuteNonQuery();
   }
   catch(Exception ex)
   {
    throw new Exception("插入数据不成功!\r\n"+ex.Message);
   }
   finally
   {
    if(sqlConn!=null)
    {
     sqlConn.Close();
     sqlConn.Dispose();
    }
   }

   return cnts;
  }

  #endregion
 
  #region UPDATE 该函数修改表中满足搜索条件的所有记录

  /// <summary>
  /// 该函数修改表中满足搜索条件的所有记录。
  /// 搜索条件为一个哈希表。
  ///  其中:哈希表中的每一个键值为数据库表中的列名,键所对应的对象即为列对应的值。
  /// 要修改的数据为一个哈希表。
  ///  其中:哈希表中的每一个键值为数据库表中的列名,键所对应的对象即为列对应的值。
  /// 该函数处理的SQL语句类型为:UPDATE Tablename SET updateList WHERE searchCondition
  /// </summary>
  /// <param name="data">修改后的数据</param>
  /// <param name="searchCondition">搜索条件</param>
  /// <returns>返回受影响的行数</returns>
  public int Update(Hashtable data, Hashtable searchCondition)
  {
   int cnts = -1;
   // 创建到数据库的连接以及数据库命令,设置命令类型为SQL文本命令
   SqlConnection sqlConn = new SqlConnection(sqlConnString);
   SqlCommand sqlCmd = new SqlCommand();
   sqlCmd.Connection = sqlConn;
   sqlCmd.CommandType = CommandType.Text;

   // 创建更新命令SQL语句中的更新列表子句,设置每一个参数的名字和值
   string updateList = "";
   string parameterName = "";
   foreach (string columnName in data.Keys)
   {
    parameterName = "@" + columnName.Replace("[","").Replace("]","");
    updateList += columnName + "=" + parameterName + ",";
    sqlCmd.Parameters.Add(parameterName, data[columnName]);
   }
   if(updateList.Equals(""))
   {
    return cnts;
   }
   // 去除更新列表子句中最后的逗号
   updateList = updateList.Substring(0, updateList.Length - 1);

   // 创建条件子句,设置参数的名字和值
   string condition = "";
   foreach (string columnName in searchCondition.Keys)
   {
    // 条件中的列名可能和更新列表中的列名重复,因此构造一个新的参数名
    parameterName = "@New" + columnName.Replace("[","").Replace("]","");
    condition += columnName + "=" + parameterName + " AND ";
    sqlCmd.Parameters.Add(parameterName, searchCondition[columnName]);
   }
   if(condition!="")
   {
    // 去除条件子句最后的" AND "子串
    condition = condition.Substring(0, condition.Length - 5);
    condition ="  WHERE "+condition;
   } 

   // 组装完整的更新命令SQL语句并设置数据库命令的属性
   string updateSql = "UPDATE " + tableName + " SET " + updateList + condition;
   sqlCmd.CommandText = updateSql;

   // 打开到数据库的连接并执行命令
   try
   {
    sqlConn.Open();
    cnts = sqlCmd.ExecuteNonQuery();
   }
   catch(Exception ex)
   {
    throw new Exception("修改数据不成功!\r\n"+ex.Message);
   }
   finally
   {
    if(sqlConn!=null)
    {
     sqlConn.Close();
     sqlConn.Dispose();
    }
   }

   return cnts;
  }

  #endregion

  #region DELETE 该函数从表中删除所有满足搜索条件的记录

  /// <summary>
  /// 该函数从表中删除所有满足搜索条件的记录。
  /// 搜索条件为一个哈希表。
  ///     其中:哈希表中的每一个键值为数据库表中的对应的列名,键所对应的对象即为列对应的值。
  /// 该函数处理的SQL语句类型为:DELETE Tablename WHERE searchCondition
  /// </summary>
  /// <param name="searchCondition">搜索条件</param>
  /// <returns>返回受影响的行数</returns>
  public int Delete(Hashtable searchCondition)
  {
   int cnts = -1;
   // 创建到数据库的连接以及数据库命令,设置命令类型为SQL文本命令
   SqlConnection sqlConn = new SqlConnection(sqlConnString);
   SqlCommand sqlCmd = new SqlCommand();
   sqlCmd.Connection = sqlConn;
   sqlCmd.CommandType = CommandType.Text;

   // 创建条件子句,设置参数的名字和值
   string condition = "1=1 AND ";;
   string parameterName = "";
   if(searchCondition!=null)
   {
    foreach (string columnName in searchCondition.Keys)
    {
     parameterName = "@" + columnName.Replace("[","").Replace("]","");
     condition += columnName + "=" + parameterName + " AND ";
     sqlCmd.Parameters.Add(parameterName, searchCondition[columnName]);
    }
   }
   // 去除条件子句最后的" AND "子串
   condition = condition.Substring(0, condition.Length - 5);

   // 组装完整的删除命令SQL语句并设置命令的文本属性
   string deleteSql = "DELETE " + tableName + " WHERE " +  condition;
   sqlCmd.CommandText = deleteSql;
   
   // 打开到数据库的连接并执行命令
   try
   {
    sqlConn.Open();
    cnts = sqlCmd.ExecuteNonQuery();
   }
   catch(Exception ex)
   {
    throw new Exception("删除数据不成功!\r\n"+ex.Message);
   }
   finally
   {
    if(sqlConn!=null)
    {
     sqlConn.Close();
     sqlConn.Dispose();
    }
   }

   return cnts;
  }

  #endregion

  #region SELECT 该函数选择数据库记录

  /// <summary>
  /// 该函数选择满足条件的数据库记录。
  /// 搜索条件为一个哈希表。
  ///     其中:哈希表中的每一个键值为数据库表中的对应的列名,键所对应的对象即为列对应的值。
  /// 该函数处理的SQL语句类型为:SELECT * FROM TableName WHERE searchCondition
  /// </summary>
  /// <param name="data">搜索条件</param>
  /// <returns>返回结果集</returns>
  public DataTable Select(Hashtable searchCondition)
  {
   // 创建到数据库的连接以及数据库命令
   SqlConnection sqlConn = new SqlConnection(sqlConnString);
   SqlCommand sqlCmd = new SqlCommand();
   sqlCmd.Connection = sqlConn;
   sqlCmd.CommandType = CommandType.Text;

   // 创建条件子句,设置参数的名字和值
   string condition = "1=1 AND ";
   if(searchCondition!=null)
   {
    string parameterName = "";
    foreach (string columnName in searchCondition.Keys)
    {
     parameterName = "@" + columnName.Replace("[","").Replace("]","");
     condition += columnName + "=" + parameterName + " AND ";
     sqlCmd.Parameters.Add(parameterName, searchCondition[columnName]);
    }
   }
   // 去除条件子句最后的" AND "子串
   condition = condition.Substring(0, condition.Length - 5);

   // 组装完整的删除命令SQL语句并设置命令的文本属性
   string selectSql = "SELECT * FROM " + tableName + " WHERE " + condition;
   sqlCmd.CommandText = selectSql;

   DataSet ds = new DataSet();
   SqlDataAdapter adapter = new SqlDataAdapter();
   adapter.SelectCommand = sqlCmd;
   // 打开连接并执行数据库命令
   try
   {
    adapter.Fill(ds);
   }
   catch(Exception ex)
   {
    throw new Exception("选择数据不成功!\r\n"+ex.Message);
   }

   return ds.Tables[0];
  }

  /// <summary>
  /// 该函数选择满足条件的数据库记录。
  /// 搜索条件为一个哈希表。
  ///     其中:哈希表中的每一个键值为数据库表中的对应的列名,键所对应的对象即为列对应的值。
  /// 该函数处理的SQL语句类型为:SELECT colName FROM TableName WHERE searchCondition
  /// </summary>
  /// <param name="colName">列名</param>
  /// <param name="data">搜索条件</param>
  /// <returns>返回对象列表,如果没有符合条件的数据则返回null。</returns>
  public ArrayList Select(string[] colName, Hashtable searchCondition)
  {
   ArrayList obj = null;

   // 创建到数据库的连接以及数据库命令
   SqlConnection sqlConn = new SqlConnection(sqlConnString);
   SqlCommand sqlCmd = new SqlCommand();
   sqlCmd.Connection = sqlConn;
   sqlCmd.CommandType = CommandType.Text;

   // 创建条件子句,设置参数的名字和值
   string condition = "1=1 AND ";
   if(searchCondition!=null)
   {
    string parameterName = "";
    foreach (string columnName in searchCondition.Keys)
    {
     parameterName = "@" + columnName.Replace("[","").Replace("]","");
     condition += columnName + "=" + parameterName + " AND ";
     sqlCmd.Parameters.Add(parameterName, searchCondition[columnName]);
    }
   }
   // 去除条件子句最后的" AND "子串
   condition = condition.Substring(0, condition.Length - 5);

   string colNameList = "";
   for(int i=0;i<colName.Length;i++)
   {
    colNameList += colName[i]+",";
   }
   colNameList = colNameList.Substring(0, colNameList.Length - 1);

   // 组装完整的删除命令SQL语句并设置命令的文本属性
   string selectSql = "SELECT " + colNameList + " FROM " + tableName + " WHERE " + condition;
   sqlCmd.CommandText = selectSql;

   SqlDataReader dreader = null;
   // 打开连接并执行数据库命令
   try
   {
    sqlConn.Open();
    dreader = sqlCmd.ExecuteReader();
    if(dreader.Read())
    {
     obj = new ArrayList();
     for(int i=0;i<colName.Length;i++)
     {
      obj.Add(dreader[i]);
     }
    }
   }
   catch(Exception ex)
   {
    throw new Exception("选择数据不成功!\r\n"+ex.Message);
   }
   finally
   {
    if(sqlConn!=null)
    {
     if(dreader!=null) dreader.Close();
     sqlConn.Close();
     sqlConn.Dispose();
    }
   }

   return obj;
  }

  #endregion
 }
}

posted on 2005-09-18 23:15  刘余学  阅读(182)  评论(0)    收藏  举报

导航