本想用三层架构(数据层DAL,业务逻辑层BLL,界面层UI)+参数化查询的一个简单登陆实例,等一天教给大二的几个同学。在这样一个小程序中,DAL层中一个简单操作经折腾了好一会, 归根结底就要从cmd.ExecuteNonQuery()使用说起:
2012年12月12日17:25:16
今天利用三层架构+参数化查询做个小示例;代码很简单,直接入正题,代码如下:
/// <summary>
/// 主题:登陆(UI层)
/// 时间:2012年12月12日14:44:58
/// 功能:通过用户名密码输入,实现登陆验证
/// 作者:bnc
/// </summary>
/// <param name="myuser">用户名</param>
/// <param name="mypwd">密码</param>
/// <param name="falg">判断返回值</param>
protected void butok_Click(object sender, EventArgs e)
{
try
{
string user = txtuser.Text;
string pwd = txtpwd.Text;
BLL.blllogin bln = new BLL.blllogin();
bool falg = bln.bllselectlogin(user, pwd);
if (falg == true)
{
Response.Write("<script>alert('登陆成功!')</script>");
}
else
{
Response.Write("<script>alert('登陆失败!')</script>");
}
}
/// <summary>
/// 主题:逻辑判断登陆(BLL层 )
/// 时间:2012年12月12日15:40:43
/// 描述:通过逻辑业务处理,验证登陆信息
/// 作者:bnc
/// </summary>
dallogin dln = new dallogin();
public bool bllselectlogin(string user,string pwd)
{
return dln.selectlogin(user,pwd);
}
public class dallogin
{
SqlConnection con= new SqlConnection(ConfigurationManager.ConnectionStrings["sqlcon"].ConnectionString);
/// <summary>
/// 主题:验证登陆(DAL层)
/// 时间:2012年12月12日15:32:39
/// 描述:在dal层进行数据库执行操作,验证登陆信息
/// 作者:bnc
/// </summary>
/// <param name="user"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public bool selectlogin(string user, string pwd)
{
con.Open();
SqlCommand cmd = new SqlCommand("select * from login where l_user=@user and l_pwd=@pwd", con);
cmd.Parameters.Add(new SqlParameter("@user", SqlDbType.VarChar, 30)).Value = user;
cmd.Parameters.Add(new SqlParameter("@pwd", SqlDbType.VarChar, 30)).Value = pwd;
return cmd.ExecuteNonQuery() > 0 ? true : false;
}
}
问题出现:
运行后,总是弹出登录失败。于是就只能跟中调试。调试 结果显示ruturn false。反复查看代码,发现代码本身没有错误,最可能出现问题的便是返回语句了,于是转的定义查看,结果如下:
public override int ExecuteNonQuery();
//
// 摘要:
// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到 System.Data.SqlClient.SqlCommand.Connection
// 并生成一个 System.Data.SqlClient.SqlDataReader。
//
// 返回结果:
// 一个 System.Data.SqlClient.SqlDataReader 对象。
//
// 异常:
// System.Data.SqlClient.SqlException:
// 在对锁定的行执行该命令期间发生了异常。如果使用的是 Microsoft .NET Framework 1.0 版,将不会生成该异常。
//
// System.InvalidOperationException:
// 连接的当前状态为关闭。System.Data.SqlClient.SqlCommand.ExecuteReader() 需要打开的 System.Data.SqlClient.SqlConnection。
出错原因:
ExecuteNonQuery对连接执行 Transact-SQL 语句并返回受影响的行数,返回int类型。执行insert,delete,update时返回受影响的行数。未执行返回-1;
但是:如果针对以上查询执行或者创建表等结构执行时,执行会返回-1;
修改错误:
public class dallogin
{
SqlConnection con= new SqlConnection(ConfigurationManager.ConnectionStrings["sqlcon"].ConnectionString);
/// <summary>
/// 主题:验证登陆(DAL层)
/// 时间:2012年12月12日15:32:39
/// 描述:在dal层进行数据库执行操作,验证登陆信息
/// 作者:bnc
/// </summary>
/// <param name="user"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public bool selectlogin(string user, string pwd)
{
try
{
con.Open();
SqlCommand cmd = new SqlCommand("select * from login where l_user=@user and l_pwd=@pwd", con);
cmd.Parameters.Add(new SqlParameter("@user", SqlDbType.VarChar, 30)).Value = user;
cmd.Parameters.Add(new SqlParameter("@pwd", SqlDbType.VarChar, 30)).Value = pwd;
SqlDataReader dr = cmd.ExecuteReader();
return dr.Read();
}
finally
{
con.Close();
}
}
}
总结:
ExecuteReader的用法转的定义如下:
public SqlDataReader ExecuteReader();
//
// 摘要:
// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到 System.Data.SqlClient.SqlCommand.Connection,并使用
// System.Data.CommandBehavior 值之一生成一个 System.Data.SqlClient.SqlDataReader。
//
// 参数:
// behavior:
// System.Data.CommandBehavior 值之一。
//
// 返回结果:
// 一个 System.Data.SqlClient.SqlDataReader 对象。
读取后dr.Read()返回bool值
ExecuteScalar的操作,返回结果集中第一行第一列,忽略其他行和列
public override object ExecuteScalar();
//
// 摘要:
// 将 System.Data.SqlClient.SqlCommand.CommandText 发送到 System.Data.SqlClient.SqlCommand.Connection
// 并生成一个 System.Xml.XmlReader 对象。
//
// 返回结果:
// 一个 System.Xml.XmlReader 对象。
到现在,问题解决了,就那么一个小问题,经常使用时也没太注意细节,导致逻辑性的错误。
//
// 异常:
// System.Data.SqlClient.SqlException:
// 在对锁定的行执行该命令期间发生了异常。如果使用的是 Microsoft .NET Framework 1.0 版,将不会生成该异常。