子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

bobolovemomo2 2010-10-04 11:16:00
建了一个存储过程(用于用户登录判断是否用户名已存在,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();
...全文
430 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobolovemomo2 2010-10-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 findcaiyzh 的回复:]

在sql server里运行一下。应该也有同样的错误吧。

应该是给lastchatinfo 赋值的select返回多行结果了。
UPDATE users SET lastchatinfo = ( SELECT ISNULL(MAX(infoid), 0) FROM chartinfo )
UPDATE users SET isonline = 1, lastchatinfo = ( S……
[/Quote]

解决了。是参数写错了,UPDATE users SET lastchatinfo = ( SELECT ISNULL(MAX(infoid), 0) FROM chartinfo )
UPDATE users SET isonline = 1, lastchatinfo = ( SELECT ISNULL(MAX(userid), 0) FROM chartinfo ) 这2个是要一样的。

谢谢大家~~
fellowcheng 2010-10-05
  • 打赏
  • 举报
回复
try
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

to
if not exists( SELECT userid FROM users WHERE username = @username )
Begin
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
End
宝_爸 2010-10-05
  • 打赏
  • 举报
回复
在sql server里运行一下。应该也有同样的错误吧。

应该是给lastchatinfo 赋值的select返回多行结果了。
UPDATE users SET lastchatinfo = ( SELECT ISNULL(MAX(infoid), 0) FROM chartinfo )
UPDATE users SET isonline = 1, lastchatinfo = ( SELECT ISNULL(MAX(userid), 0) FROM chartinfo )
MSDNXGH 2010-10-05
  • 打赏
  • 举报
回复
专业 顶贴!接分! 不解释!
bobolovemomo2 2010-10-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]

子查询分析器执行存储过程
可能数据多余1
select top 1
[/Quote]


那是新注册的用户的 状态参量 isonline=1 表示在线。
wuyq11 2010-10-04
  • 打赏
  • 举报
回复
子查询分析器执行存储过程
可能数据多余1
select top 1

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧