/*自定义导航栏*/

【数据库】SqlCommand的几个易忽视的执行操作

   本想用三层架构(数据层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 版,将不会生成该异常。

 

posted @ 2012-12-12 17:50  伏草惟存  阅读(868)  评论(0编辑  收藏  举报