文章教程

7.2数据库操作通用类DBHelper

8/31/2020 8:52:25 PM 人评论 次浏览

7.2 数据库操作通用类DBHelper

学习目标

掌握数据库通用类DBHelper

这里就以ASP.NET操作SQL Server数据库为例来分析通用类DBHelper实现方法。其实程序语言操作数据库通常要实现的操作无非就是增、删、改、查这些操作。

7.2.1 建立数据库连接GetConn

程序语言要操作数据库中的数据信息,首先要建立一个程序语言与数据库之间的连接通道,在ADO.NET操作SQL Server中用的就是SqlConnection这个类来完成数据库连接通道的创建,核心用的就是SqlConnection的ConnectionString属性建立的连接字符串。由于每次数据库的操作都和ConnectionString关联,所以可以把这个连接字符串封装到一个方法中,不妨命名为GetConn,该方法源代码如下。

public SqlConnection GetConn()
{
  SqlConnection conn = new SqlConnection(@"server=hst;uid=sa;
  pwd=sa;database=bjtvcom_db");
  return conn;
}

7.2.2 标准SQL语句操作的方法

1.读操作(SELECT)

读取数据表操作,也就是SELECT语句,可能是普通SQL SELECT语句,例如:

Select id,name,sex,city from student order by id asc;
Select id,name,sex,city from student where sex='男' and city=
'北京' order by id asc;

也可能是带有参数的SQL SELECT语句,例如:

Select id,name,sex,city from student where sex=@sex and city=@city
order by id asc;

考虑到SQL注入的问题,最好能用参数化SQL语句来完成上述操作。这样一来,读操作(SELECT)就分两种情形,一种是标准SQL语句,一种是参数化SQL语句,当然就得写两个方法了,读取的结果刚好符合.NET中System.Data.DataTable的结构,故两个方法返回值类型都是System.Data.DataTable类型,又考虑到#语言OOP支持方法重载,故这里的两个方法可以使用相同的名字,而源代码可以写出两种形式即可。

接下来给出这两个方法的源代码。

//不带参数的SQL语句执行读取操作方法
public DataTable GetTable(string sql)
{
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
}
//带有参数的SQL语句执行读取操作方法,这里使用Hashtable来传递参数key/
value对
public DataTable GetTable(string sql, Hashtable ht)
{
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(sql, conn); foreach (DictionaryEntry de in ht)
    {
       sda.SelectCommand.Parameters.AddWithValue(de.Key.ToString(), de.Value.ToString());
    }
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
}

2.维护操作(INSERT、DELETE、UPDATE)

维护操作当然也是分两种情形,一种是标准SQL语句完成维护操作,一种是参数化的SQL语句完成维护操作。

接下来给出这两个方法的源代码。

//标准SQL语句执行维护操作的方法
public int Execute(string sql)
{
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(sql, conn);
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
}
//参数化SQL语句执行维护操作的方法,这里使用Hashtable来传递参数key/value对
public int Execute(string sql, Hashtable ht)
{
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(sql, conn);
    foreach (DictionaryEntry de in ht)
    {
       comm.Parameters.AddWithValue(de.Key.ToString(), de.Value.ToString());
    }
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
  }

7.2.3 使用存储过程操作的方法

1.读操作(SELECT)

存储过程实现读取操作,最终返回的依然是一个table,只是程序发给db的指令类型发生了变化,故代码格式和上述SQL语句操作类似,当然同样也存在有参数的情形、没有参数的情形,也就是说有两个方法。

接下来给出这两个方法的源代码。

  //不带参数的存储过程调用的方法
  public DataTable GetTableByProc(string procName)
  {
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(procName, conn);
    sda.SelectCommand.CommandType = CommandType.StoredProcedure;
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
  }
  //带参数的存储过程调用的方法
  public DataTable GetTableByProc(string procName, Hashtable ht)
  {
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(procName, conn);
    sda.SelectCommand.CommandType = CommandType.StoredProcedure;
    foreach (DictionaryEntry de in ht)
    {
       sda.SelectCommand.Parameters.AddWithValue(de.Key.
       ToString(), de.Value.ToString());
    }
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
}

2.维护操作(INSERT、DELETE、UPDATE)

维护操作当然也分两种情形,一种是没有参数的存储过程完成的维护操作,一种是带有参数的存储过程完成的维护操作。

接下来给出这两个方法的源代码。

  //没有参数的存储过程完成的维护操作
  public int ExecuteProc(string procName)
  {
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(procName, conn);
    comm.CommandType = CommandType.StoredProcedure;
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
  }
  //带有参数的存储过程完成的维护操作
  public int ExecuteProc(string procName, Hashtable ht)
  {
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(procName, conn);
    comm.CommandType = CommandType.StoredProcedure;
    foreach (DictionaryEntry de in ht)
    {
       comm.Parameters.AddWithValue(de.Key.ToString(), de.Value.
       ToString());
    }
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
  }

7.2.4 完整DBHelper源代码

通过以上的操作功能分析,接下来给出完整DBHelper源代码,代码中本身已经编写了部分注释,考虑到篇幅问题,删除了部分注释。

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Collections;

//操作SQL Server数据库的通用类
public class DBHelper
{
  //生成连接字符串
  public SqlConnection GetConn()
  {
    SqlConnection conn = new SqlConnection(@"server=ALISION;
    uid=sa;pwd=sa;database=db");
    return conn;
  }
  //根据SELECT SQL语句,没有参数,返回一个DataTable
  public DataTable GetTable(string sql)
  {
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
  }
  //根据SELECT SQL语句,有参数,返回一个DataTable
  public DataTable GetTable(string sql, Hashtable ht)
  {
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
     foreach (DictionaryEntry de in ht)
    {
       sda.SelectCommand.Parameters.AddWithValue(de.Key.
       ToString(), de.Value.ToString());
    }
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
  }
  //根据SELECT SQL语句,没有参数,返回一个DataRow
  public DataRow GetRow(string sql)
  {
    DataRow row;
    if (this.GetTable(sql).Rows.Count >= 1)
    {
       row = this.GetTable(sql).Rows[0];
    }
    else
    {
       row = null;
    }
    return row;
  }
  //根据SELECT SQL语句,有参数,返回一个DataRow
  public DataRow GetRow(string sql, Hashtable ht)
  {
    DataRow row;
    if (this.GetTable(sql, ht).Rows.Count >= 1)
    {
       row = this.GetTable(sql, ht).Rows[0];
    }
    else
    {
       row = null;
    }
    return row;
  }
  //根据SELECT SQL语句,没有参数,返回首行首列的值
  public string GetValue(string sql)
  {
    string str = "";
    if (this.GetRow(sql) != null)
    {
       str = this.GetRow(sql)[0].ToString();
    }
    return str;
  }
  //根据SELECT SQL语句,有参数,返回首行首列的值
  public string GetValue(string sql, Hashtable ht)
  {
    string str = "";
    if (this.GetRow(sql, ht) != null)
    {
       str = this.GetRow(sql, ht)[0].ToString();
    }
    return str;
  }
  //根据存储过程,没有参数,返回一个DataTable
  public DataTable GetTableByProc(string procName)
  {
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(procName, conn);
    sda.SelectCommand.CommandType = CommandType.StoredProcedure;
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
  }
  //根据存储过程,有参数,返回一个DataTable
  public DataTable GetTableByProc(string procName, Hashtable ht)
  {
    SqlConnection conn = this.GetConn();
    SqlDataAdapter sda = new SqlDataAdapter(procName, conn);
    sda.SelectCommand.CommandType = CommandType.StoredProcedure;
    foreach (DictionaryEntry de in ht)
    {
       sda.SelectCommand.Parameters.AddWithValue(de.Key.
       ToString(), de.Value.ToString());
    }
    DataTable table = new DataTable();
    sda.Fill(table);
    return table;
  }
  //根据存储过程,没有参数,返回一个DataRow
  public DataRow GetRowByProc(string procName)
  {
    DataRow row;
    if (this.GetTableByProc(procName).Rows.Count >= 1)
    {
       row = this.GetTableByProc(procName).Rows[0];
    }
    else
    {
       row = null;
    }
    return row;
  }
  //根据存储过程,有参数,返回一个DaTarow
  public DataRow GetRowByProc(string procName, Hashtable ht)
  {
    DataRow row;
    if (this.GetTableByProc(procName, ht).Rows.Count >= 1)
    {
       row = this.GetTableByProc(procName, ht).Rows[0];
    }
    else
    {
       row = null;
    }
    return row;
  }
  //根据存储过程,没有参数,返回首行首列的值
  public string GetValueByProc(string procName)
  {
    string str = "";
    if (this.GetRowByProc(procName) != null)
    {
       str = this.GetRowByProc(procName)[0].ToString();
    }
    return str;
  }
  //根据存储过程,有参数,返回首行首列的值
  public string GetValueByProc(string procName, Hashtable ht)
  {
    string str = "";
    if (this.GetRowByProc(procName, ht) != null)
    {
          str = this.GetRowByProc(procName, ht)[0].
ToString();
    }
    return str;
  }
  //普通SQL语句,执行维护操作,没有参数
  public int Execute(string sql)
  {
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(sql, conn);
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
  }
  //普通SQL语句,执行维护操作,有参数
  public int Execute(string sql, Hashtable ht)
  {
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(sql, conn);
    foreach (DictionaryEntry de in ht)
    {
       comm.Parameters.AddWithValue(de.Key.ToString(),
       de.Value.ToString());
    }
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
  }
  //存储过程,执行维护操作,没有参数
  public int ExecuteProc(string procName)
  {
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(procName, conn);
    comm.CommandType = CommandType.StoredProcedure;
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
  }
  //存储过程,执行维护操作,有参数
  public int ExecuteProc(string procName, Hashtable ht)
  {
    SqlConnection conn = this.GetConn();
    conn.Open();
    SqlCommand comm = new SqlCommand(procName, conn);
    comm.CommandType = CommandType.StoredProcedure;
    foreach (DictionaryEntry de in ht)
    {
       comm.Parameters.AddWithValue(de.Key.ToString(), de.Value.ToString());
    }
    int c = comm.ExecuteNonQuery();
    conn.Close();
    return c;
  }
}

完整代码可以参照/Code/ch07/DBHelper.cs。

教程类别