数据库表结构:
Account
Password
Online
Locked存储过程如下:
ALTER PROCEDURE dbo.Account_Login
(
@ACCOUNT nvarchar(16),
@PASSWORD nvarchar(32)
)
AS
DECLARE @LOCKED bit, @ONLINE bit SELECT TOP 1 @LOCKED = Locked, @ONLINE = Online
FROM Accounts
WHERE (Account = @ACCOUNT) AND (Password = @PASSWORD)

IF @@ROWCOUNT = 1
IF @LOCKED = 0
BEGIN
IF @ONLINE = 0
BEGIN
UPDATE Accounts
SET Online = 1
WHERE (Account = @ACCOUNT) AND (Password = @PASSWORD)
RETURN 0 /*登陆成功*/
END
ELSE
RETURN 3 /*账号已经登陆*/
END
ELSE
RETURN 2 /*账号已被锁定*/
ELSE
RETURN 1 /*账号不存在或密码不正确*/C#代码如下:(片断)
string account, password;
account = Request.Form["Account"].ToLower();
password = FormsAuthentication.HashPasswordForStoringInConfigFile(Request.Form["Password"],"md5"); sqlComm.CommandText = "Account_Test_Exist";
sqlComm.Parameters.Add("@ACCOUNT", account);
sqlComm.Parameters.Add("@PASSWORD", password);
sqlComm.Parameters.Add("@RETURNVALUE",SqlDbType.Int);
sqlComm.Parameters["@RETURNVALUE"].Direction = ParameterDirection.ReturnValue;
sqlConn.Open();
sqlComm.ExecuteNonQuery();
returnValue =  Convert.ToInt32(sqlComm.Parameters["@RETURNVALUE"].Value);现有账号(Account=administrator,Password=md5(Administrator),Locked=0,Online=1)即我假定这个用户在线。
在.net开发环境中执行存储过程
运行dbo."Account_Login" ( @ACCOUNT = administrator, @PASSWORD = 7B7BC2512EE1FEDCD76BDC68926D4F7B ).没有行受影响。
没有更多的结果。
(返回 0 行)
@RETURN_VALUE = 3
完成 dbo."Account_Login" 运行。结果正常。但在C#执行过程中返回值returnValue却是0但在C#执行过程中的给入不存在的用户名或密码却能返回1(和存储过程返回值相同)
这是为什么啊???痛苦中!!!(存储过程和C#的值有时相同有时不同这是为什么?)

解决方案 »

  1.   

    sqlComm.Parameters.Add("RETURNVALUE",SqlDbType.Int);
    sqlComm.Parameters["RETURNVALUE"].Direction = ParameterDirection.ReturnValue;
    sqlConn.Open();
    sqlComm.ExecuteNonQuery();
    returnValue =  Convert.ToInt32(sqlComm.Parameters["RETURNVALUE"].Value);还有你的存储过程怎么用的是ALTER?
    每次都需要修改?
      

  2.   

    Account_Login-Account_Test_Exist?数据库中和c#中的存储过程名字不一样啊。另外,把IF @@ROWCOUNT = 1改一下:
    if exists(select 1 from FROM Accounts WHERE (Account = @ACCOUNT) AND (Password = PASSWORD))为好。
    再试试看。