机房重构到现在已经实现了几个功能了,可以说非常缓慢了,但是还是遇到了不少的问题,这次遇到的这个问题问了几个师哥都没有解决掉,搁置了一个突然就感觉开窍了,先来看问题:这个实在添加学生信息的功能出现的问题,下图:
它显示的问题是必须声明标量变量,看着标量变量可能大多数人都会想到是不是实体层没有定义,或者是哪个层少写了,我也是这么想的,所以一开始我就把能涉及到的层全都检查了一遍,但是还是不行,还是报同样的错误,问了其他人也没有想法了,然后突然想到师父提到的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对象,以便最有效地管理与阅读器关联的连接的有效期。