子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
建了一个存储过程(用于用户登录判断是否用户名已存在,1 存在且密码正确 则登录。2 存在而密码错误,则提示错误。3用户名不存在 则自动注册。):
CREATE PROCEDURE UserLogin
@username varchar(50),
@password varchar(50)
AS
--用户名密码正确
IF EXISTS ( SELECT userid FROM users WHERE username = @username AND psw = @password )
BEGIN
UPDATE users SET isonline = 1, lastchatinfo = ( SELECT ISNULL(MAX(userid), 0) FROM chartinfo )
WHERE username = @username AND psw = @password
--发布公告
INSERT INTO chartinfo (sender,receiver, content,face, color, isopen, [time])
RETURN 0
END
--用户名存在,密码不正确
IF EXISTS ( SELECT userid FROM users WHERE username = @username and psw!=@password)
RETURN 1
--用户名不存在,则根据输入创建新用户
if not exists( SELECT userid FROM users WHERE username = @username )
INSERT INTO users (username, psw, isonline) VALUES ( @username, @password, 1 )
UPDATE users SET lastchatinfo = ( SELECT ISNULL(MAX(infoid), 0) FROM chartinfo )
WHERE username = @username AND psw = @password
--发布公告
INSERT INTO chartinfo (sender,receiver, content,face, color, isopen, [time])
RETURN 2
GO
后台代码为:
protected void Button1_Click1(object sender, EventArgs e)
{
int iRet = -1;
SqlConnection conn = new SqlConnection("DataBase=localhost;Initial Catalog=网上聊天室;Integrated Security=SSPI;");
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "UserLogin";
cmd.Parameters.Add("@username", TextBox1.Text );
cmd.Parameters.Add("@password", TextBox2.Text );
//存储过程返回值
SqlParameter paramOut = cmd.Parameters.Add("@RETURN_VALUE", "");
paramOut.Direction = ParameterDirection.ReturnValue;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
iRet = (int)cmd.Parameters["@RETURN_VALUE"].Value;
if (iRet == 0) //登录成功
{
Session["用户名"] = TextBox1.Text;
Label1.Text = TextBox1.Text;
this.MultiView1.ActiveViewIndex = 1;
}
else if (iRet == 1) //密码不正确
{
Response.Write("<script>alert('密码不正确')</script>");
}
else if (iRet == 2) //新注册用户
{}
}
运行后提示:子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
语句已终止。是指向cmd.ExecuteNonQuery();