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

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

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


636890807b53780c1fccb6bc3cf726ff_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTMwOTE1NQ==,size_16,color_FFFFFF,t_70.png


它显示的问题是必须声明标量变量,看着标量变量可能大多数人都会想到是不是实体层没有定义,或者是哪个层少写了,我也是这么想的,所以一开始我就把能涉及到的层全都检查了一遍,但是还是不行,还是报同样的错误,问了其他人也没有想法了,然后突然想到师父提到的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对象,以便最有效地管理与阅读器关联的连接的有效期。


相关文章
|
关系型数据库 MySQL 开发工具
NextCloud自建家用网盘
在阿里云ECS(2核2G,SSD40G,3M带宽)上,安装Ubuntu 22.04,然后配置FRPs,设置权限,开放端口。本地服务器拉取 `NextCloud` Docker镜像,并通过docker-compose进行容器部署,容器启动成功,通过FRPc链接到云主机,到这里就已经实现本地网盘服务可以通过公网访问。
539 0
|
10月前
|
监控 数据可视化 数据挖掘
ThingWorx 是如何实现数据可视化的
ThingWorx通过其强大的数据可视化工具,将复杂的数据转化为直观的图表和仪表板,帮助用户快速理解并分析数据,支持定制化视图以满足不同需求,提升决策效率。
261 12
|
11月前
|
Web App开发 前端开发 JavaScript
|
人工智能 自然语言处理 文字识别
MinerU-大语言语料处理神器,CPU/GPU均可跑,开源免费“敲”好用
在7月4日举行的WAIC 2024科学前沿主论坛上,书生·浦语2.5正式发布,面向大模型研发与应用的全链条工具体系同时迎来升级。
MinerU-大语言语料处理神器,CPU/GPU均可跑,开源免费“敲”好用
|
数据可视化
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Date/Time Edit的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Date/Time Edit的使用及说明
1385 2
|
Shell Python
Python教程:return和yield的区别
Python教程:return和yield的区别
355 0
Python教程:return和yield的区别
|
弹性计算 开发工具 Android开发
阿里云APP备案操作流程_亲测
阿里云APP备案操作流程_亲自测试,一共6个步骤即可完成APP备案
15640 2
|
消息中间件 监控 Cloud Native
|
应用服务中间件 nginx
Nginx隐藏版本号
修改nginx.conf配置文件 nginx配置文件里增加 server_tokens off;server_tokens作用域是http server location语句块server_tokens默认值是on,表示显示版本信息,设置server_tokens值是off,就可以在所有地方隐藏nginx的版本信息。
5533 0
|
域名解析 负载均衡 网络协议
Nginx技术专题(1)基于Nginx负载均衡机制实现负载均衡介绍和配置
Nginx技术专题(1)基于Nginx负载均衡机制实现负载均衡介绍和配置
791 0
Nginx技术专题(1)基于Nginx负载均衡机制实现负载均衡介绍和配置