上节课 我们有看到 在C#里面 执行 sql语句 和执行 存储过程 实际上就是一行语句的区别 这节课 我们也要把他们合并在一起
先继续在 NewsDAO里面 写代码
记得 如果要使用 DataTable 需要引用
using System.Data;
using System.Data.SqlClient;
下面去 SQLHelper 合并相同的
修改前
修改后
在我们输入前面一个参数 然后输入 逗号 再输入空格之后 IDE会自动定位到 CommandType 很方便
由于我们修改 SQLHelper 那么 我们也要对 CategoryDAO 进行修改
下面是修改完成之后的代码
/* *创建人:李鹏 *创建时间:2011-10-04 11:44 *说明:数据库的助手类 */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace DAL //data access layer 数据存储访问层 { public class SQLHelper { private SqlConnection conn = null; private SqlCommand cmd = null; private SqlDataReader sdr = null; public SQLHelper() { //构造函数 默认执行 //string connStr = @"server=JOEY\SQL2008;database=newssystem;uid=sa;pwd=tiantang"; conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString); } private SqlConnection GetConn() { if (conn.State == ConnectionState.Closed) { conn.Open(); } return conn; } //下面的每个方法 都可以执行 sql 语句 也可以执行 存储过程 /// <summary> /// 执行不带参数的增删改SQL语句 或者是 存储过程 /// </summary> /// <param name="cmdText">增删改SQL语句 或者是 存储过程名称</param> /// <param name="ct">cmd的命令类型CommandType</param> /// <returns></returns> public int ExecuteNonQuery(string cmdText, CommandType ct) { int res; try { cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; res = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } return res; } /// <summary> /// 执行带参数的 Sql增删改语句 或存储过程 /// </summary> /// <param name="cmdText">增删改SQL语句 或者是 存储过程名称</param> /// <param name="paras">参数集合</param> /// <param name="ct">命令类型</param> /// <returns></returns> public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct) { int res; using (cmd = new SqlCommand(cmdText, GetConn())) //using (cmd = new SqlCommand("insert into category values(@caName)", GetConn())) { // cmd.Parameters.AddRange(new SqlParameter[]{ // new SqlParameter("@caName","哈哈新闻") //}); cmd.CommandType = ct; cmd.Parameters.AddRange(paras); //这里的paras 就相当于是一个 参数集合 res = cmd.ExecuteNonQuery(); } return res; } /// <summary> /// 执行SQL查询语句 或者 存储过程 /// </summary> /// <param name="cmdText">查询SQL语句 或者是 存储过程名称</param> /// <param name="ct">命令类型</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText, CommandType ct) { DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } //CommandBehavior.CloseConnection 在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭 // sdr 也会自动关闭的 因为 using 会结束 sdr 而 conn 是被 CommandBehavior.CloseConnection 结束的 return dt; } /// <summary> /// 执行带参数的SQL查询语句 或 存储过程 /// </summary> /// <param name="cmdText"> 查询SQL语句 或者是 存储过程名称</param> /// <param name="paras">参数集合</param> /// <param name="ct">命令类型</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct) { DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; cmd.Parameters.AddRange(paras); using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } //CommandBehavior.CloseConnection 在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭 // sdr 也会自动关闭的 因为 using 会结束 sdr 而 conn 是被 CommandBehavior.CloseConnection 结束的 return dt; } } }
因为我们修改了很多代码,然后我们把DAL层 从新生成一下,这个时候会抱很多错,双击错误就会定位到错误的地方,逐一修改即可
最后 用到一个 //TODO 下节课讲用途