【发布时间】:2023-01-17 01:35:06
【问题描述】:
我正在创建 adminregistration 表,我得到了我在 SP 中创建的 2 个错误消息,最终注册成功消息我无法实现,我还更改了表索引。那也行不通。请帮我解决这个问题。
ALTER PROCEDURE [dbo].[LoginRegister]
@Fname varchar(50),
@Email varchar(50),
@Username nvarchar(50),
@Password nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
Declare @ERROR varchar(100)
--checking username not exist or not
if not exists(select * from AdminRegister where Username = @Username)
BEGIN
Insert into AdminRegister(FName,Email,Username,Password) values (@Fname,@Email,@Username,@Password)
SET @ERROR=@UserName+' has registered successfully.'
select @ERROR as ERRORMsg
END
ElSE if exists(select * from AdminRegister where Username = @Username)
BEGIN
SET @ERROR=@UserName + ' has already exists.'
select @ERROR as ERRORMsg
END
ELSE
BEGIN
SET @ERROR = 'Reistered successfully'
select @ERROR as Errorsuccess
END
END
protected void Register_Click(object sender, EventArgs e)
{
ValidateEmail();
con.Open();
SqlCommand cmd = new SqlCommand("LoginRegister",con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Fname", SqlDbType.VarChar).Value = txtname.Text;
cmd.Parameters.AddWithValue("@Email", SqlDbType.VarChar).Value = txtmail.Text;
cmd.Parameters.AddWithValue("@Username", SqlDbType.NVarChar).Value = txtusername.Text;
cmd.Parameters.AddWithValue("@Password", SqlDbType.NVarChar).Value = txtPassword.Text;
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(ds);
con.Close();
Lblmsg.Text= ds.Tables[0].Rows[0].Field<string>("ERRORMsg");
String Result = ds.Tables[2].Rows[0].Field<string>("Errorsuccess");
Response.Write("<script LANGUAGE='JavaScript' >alert('"+Result+"')</script>");
Clear();
}
【问题讨论】:
-
如果您想向应用层发送(自定义)错误,为什么您要
SELECTing 一条消息,而不是THROWing 呢?发生错误时只是THROW一个error;不需要SELECT声明“'Reistered successfully”;没有错误表示成功。 (它也拼写为 registered。) -
此外,您似乎打算存储纯文本密码。这是个极其愚蠢的努力。它让您和您的用户对巨大的安全风险。总是像这样的散列和盐密码。
-
你为什么要检查两次该用户是否存在?当第一个
if条件失败时,你知道用户存在,因此无需再次检查 -
除了... AddWithValue is Evil。您不应该使用
AddWithValue()并且您无论如何都在错误地使用它。
标签: javascript c# asp.net sql-server