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