机房重构错误----必须声明标量变量和SQLHelper的使用

机房重构到现在已经实现了几个功能了,可以说非常缓慢了,但是还是遇到了不少的问题,这次遇到的这个问题问了几个师哥都没有解决掉,搁置了一个突然就感觉开窍了,先来看问题:这个实在添加学生信息的功能出现的问题,下图:

它显示的问题是必须声明标量变量,看着标量变量可能大多数人都会想到是不是实体层没有定义,或者是哪个层少写了,我也是这么想的,所以一开始我就把能涉及到的层全都检查了一遍,但是还是不行,还是报同样的错误,问了其他人也没有想法了,然后突然想到师父提到的sqlhelper 的问题,因为SQLHelper的问题一直都是很模糊的,昨天刚好师父给讲了讲,什么时候要调用什么样方法,增删改查要判断好 ,想到是不是SQLHelper是不是调用错了,然后就尝试了改了一下,没想到居然成功了,看了之前的代码果然是调用了错误的方法,本来是像要往数据库里面添加数据的,但是却调用了查询的方法,自然是不会成功了,所以只在D层把调用SQL Helper的方法改了一下,就好了!增加用户详细博客看这里:https://blog.csdn.net/weixin_45309155/article/details/116275530

接下来我们说一下SQLHelper的问题,看它的名字翻译过来就是SQL的帮助者,跟第一次机房中的Moudle模块很像,我们把它写好之后就不用改了,在其他的窗体中只需要调用就好了,SQLHelper中可以很多的方法,在机房重构中,我们只用到了增删改查,所以我们先建4个方法

打开数据库

 public class SQLHelper
    {
        private SqlConnection conn = null;//定义数据连接
        private SqlCommand cmd = null;//指定能再数据库中执行操作  命令
        private SqlDataReader sdr = null;//定义一个读取数据流变量,从数据库中读取

        public SQLHelper ()
        {
            //连接数据库
            string connStr = ConfigurationManager.AppSettings["conStr"];
            conn = new SqlConnection(connStr);//实例化连接数据库
        }
        #region 打开数据库

        private SqlConnection GetConn()
        {
            if (conn.State==System.Data.ConnectionState.Closed)//如果数据库连接为关闭,则打开
            {
                conn.Open();
            }
            return conn;
        }
        #endregion

增删改

/// <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)//parameter意思为参数
        {
            int res;
            using (cmd = new SqlCommand(cmdText, GetConn())) //将sql语句作为参数能够防止sql注入
            {
                cmd.CommandType = ct;//命令类型为ct
                cmd.Parameters.AddRange(paras);//添加参数
                res = cmd.ExecuteNonQuery();
            }
            cmd.Parameters.Clear();
            return res;
        }


       
        /// <summary>
        /// 执行不带参数的增删改SQL语句或存储过程
        /// </summary>
        /// <param name="cmdText"></param>
        /// <param name="ct"></param>
        /// <returns></returns>
        public int ExecuteNonQuery(string cmdText,CommandType ct)
        {
            int res;
            try
            {
                SqlCommand 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;
        }
        #endregion 

/// <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());//实例化一个命令  cmdtext为传进来的sql命令,getconn为一个打开状态的数据库连接
            cmd.CommandType = ct;
            cmd.Parameters.AddRange(paras);//将要查询的数据放入查询语句中  Parameters参数

            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            return dt;
        }

补充:在 SqlHelper 类中实现的方法包括:
ExecuteNonQuery。此方法用于执行不返回任何行或值的命令。这些命令通常用于执行数据库更新,但也可用于返回存储过程的输出参数。
ExecuteReader。此方法用于返回SqlDataReader对象,该对象包含由某一命令返回的结果集。
ExecuteDataset。此方法返回DataSet对象,该对象包含由某一命令返回的结果集。
ExecuteScalar。此方法返回一个值。该值始终是该命令返回的第一行的第一列。
ExecuteReader:此专用 ExecuteReader 实现用于通过适当的 CommandBehavior 打开SqlDataReader对象,以便最有效地管理与阅读器关联的连接的有效期。
 

Guess you like

Origin blog.csdn.net/weixin_45309155/article/details/116275121