为什么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