zoukankan      html  css  js  c++  java
  • 【数据库】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 版,将不会生成该异常。

  • 相关阅读:
    POJ 2418 Hardwood Species(STL在map应用)
    在反思性学习
    孙陪你,了解它的权力--Kinect结合的发展Unity3D游戏应用开发
    python在windows通过安装模块错误
    Linux怪哉ntfs
    Js 表单序列化
    微信开发
    Ecshop开发
    FTP配置和用户设置权限
    wget
  • 原文地址:https://www.cnblogs.com/baiboy/p/ado.html
Copyright © 2011-2022 走看看