牛腩新闻视频 14讲 重构SQLHelper 助手类 将SQLhelper里面的每个函数 改成可以使用存储过程 //TODO 注释

上节课 我们有看到 在C#里面 执行 sql语句 和执行  存储过程  实际上就是一行语句的区别  这节课 我们也要把他们合并在一起

image

image

先继续在 NewsDAO里面 写代码

image

记得 如果要使用  DataTable 需要引用 

using System.Data;
using System.Data.SqlClient;

下面去 SQLHelper 合并相同的

修改前

image

修改后

image

在我们输入前面一个参数  然后输入 逗号  再输入空格之后  IDE会自动定位到  CommandType  很方便

image

由于我们修改  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层 从新生成一下,这个时候会抱很多错,双击错误就会定位到错误的地方,逐一修改即可

image image

最后  用到一个 //TODO  下节课讲用途

image

原文地址:https://www.cnblogs.com/iceicebaby/p/2216259.html