当前位置:编程学习 > C#/ASP.NET >>

为什么ExecuteScalar()没有执行呢

登入页面验证不了用户名和密码,不知为什么调试的时候cm.ExecuteScalar()好像没有执行,i始终都是0,传入的参数也正确;连接字符串都没问题,就是i始终为0
获取连接字符串:
private SqlConnection GetCon()
        {
            con = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString());
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            else
            {
                con.Close();
            }
            return con;
        }
登入验证代码:
public int LoginAdmin( string text,SqlParameter[] parat, CommandType ty)
        {
            int i;
            using (cm = new SqlCommand(text, GetCon()))
            {
                cm.CommandType = ty;
                cm.Parameters.AddRange(parat);
                i=(int)cm.ExecuteScalar();
            }
            return i;
        }
判断登入验证代码:
public bool SelectByUserAndPwd(Admin ad)
        {
            bool flage = false;
            int i;
            SqlParameter[] parat = new SqlParameter[]{
             new SqlParameter("@username",ad.UserName),
             new SqlParameter("@pwd",ad.UserPwd)
            };
            i = sqlhelp.LoginAdmin("Pro_AdminLogin",parat,CommandType.StoredProcedure);
            if (i > 0)
            {
                flage = true;
            }
            return flage;
        }
后台登录代码编写:
protected void dr_Click(object sender, EventArgs e)
    {
        bool flage=false;
        if (username.Text == "" || pwd.Text == "")
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('用户名和密码不能为空')</script>");
        }
        else
        {
            ad.UserName = username.Text.Trim();
            ad.UserPwd = pwd.Text.Trim();
            flage = admin.SelectByUserAndPwd(ad);
            if (flage==true)
            {
                if (yanzheng.Text == "")
                {
                    Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('验证码不能为空')</script>");
                }
                else
                {
                    if (yanzheng.Text.ToUpper().Trim() == Session["Code"].ToString())
                    {
                        Session["name"] = username.Text.Trim();
                        Response.Redirect("~/AdminLogin/AdminIndex.aspx");
                    }
                    else
                    {
                        Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('验证码不正确!')</script>");
                    }
                }
            }
        }
--------------------编程问答-------------------- ExecuteScalar返回第一条记录的第一列
查询分析器执行看看
登录返回datareader
--------------------编程问答-------------------- 对比下你的存储过程  看是否正确 --------------------编程问答-------------------- ExecuteScalar()
只返回一个值并且是第一行第一列的值  不知道lz要的是这结果吗?
如果不是用datareader --------------------编程问答-------------------- 方便将你的存储过程贴出来不。 从代码上看不出问题   你用ExecuteScalar是返回记录的首行首列 

另外你可以在查询分析器里测试下你的存储过程 也带你在界面上输的参数  看查询出来是什么结果 看第一行 第一列是什么值嘛 --------------------编程问答-------------------- 调试,第一行第一列的值 --------------------编程问答-------------------- 这个得看存储过程是怎么写的了 --------------------编程问答-------------------- ExecuteScalar返回第一条记录的第一列
最好还是用dataadaptar  --------------------编程问答-------------------- private SqlConnection GetCon()
  {
  con = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString());
  if (con.State == ConnectionState.Closed)
  {
  con.Open();
  }
  else
  {
  con.Close();
  }
  return con;
  }



为什么SqlConnection在else里面又关闭了呢 
--------------------编程问答-------------------- ExecuteScalar返回第一条记录的第一列!你直接在数据库里执行语句,看看你的值是多少就行了~我估计是没有返回值! --------------------编程问答-------------------- 是啊 返回第一行第一列的  看下返回值是不是一样类型的 你把他转换成int可以么  换个方法调用吧 --------------------编程问答-------------------- 貌似连接属性GetCon里面的判断有问题
不妨改成:
  private static SqlConnection con;

        public static SqlConnection Con
        {
            get
            {
                if (con==null)
                {
                    con=new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ToString());
                    con.Open();
                }
                else if(con.State==ConnectionState.Broken)//如果连接破坏了
                {
                    con.Close();//先关闭
                    con.Open();//再打开
                }
                else if (con.State==ConnectionState.Closed)//如果关闭了
                {
                    con.Open();//打开
                }
                return con; 
            }
--------------------编程问答-------------------- 数据库连接没有问题,能从数据库中读出来内容,但是就是这个登录读不出来,create PROCEDURE [dbo].[Pro_AdminLogin] 
@username nvarchar(20),
@pwd nvarchar(20)
AS
BEGIN
select count(*) from Admin_TAB where username=@username and userpwd=@pwd 
END
这是存储过程在数据库中执行返回的是1 --------------------编程问答-------------------- ExecuteNonQuery()是update,delete   ,insert影响行数,对于select永远返回-1(int)

ExecuteScaler()执行select返回的不是int,有时候又需要得到影响的行数

解决方法

帮执行的结果保存在dataset中

然后通过

DataSet ds=new DataSet()

ds.Tables[0].Rows.Count

可以读出行数

--------------------编程问答-------------------- 为什么我在验证用户是否存在的时候,调用的也是这个函数这时i的值为1,一到验证用户上面就不行了
public bool IsUserInAdmin(Admin ad)
        {
            bool flage = false;
            SqlParameter[] parat = new SqlParameter[]{
               new SqlParameter("@username",ad.UserName)
            };
            int i;
            i = sqlhelp.LoginAdmin("Pro_IsUserInAdmin", parat, CommandType.StoredProcedure);
            if (i > 0)
            {
                flage = true;
            }
            return flage;
        }
这是验证用户存在没,这个就可以,但是在验证登入时就不行了,存储过程也没问题,在查询分析器中返回值为1 --------------------编程问答--------------------
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,