【问题标题】:How do i find the table index from stored procedure and access it from dataset?如何从存储过程中找到表索引并从数据集中访问它?
【发布时间】: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


【解决方案1】:

addwithvalue,第二个参数可能会搞砸,不要使用它。

你真的需要存储过程吗?

为什么要使用数据集?您的存储过程只返回一个表,所以不要使用“一组”表,除非您实际上要有一组表。

此外,您不会关闭连接,但您必须打开它。

将此类代码包装在一个 using 块中,它将为您处理。

你真的需要那个存储过程吗?

我建议这样的事情:

string sResult = "";
DataTable dt = new DataTable();
using (SqlConnection con = new SqlConnection(Properties.Settings.Default.TEST4))
{
    string strSQL = "select * from AdminRegister where Username = @Username";
    using (SqlCommand cmd = new SqlCommand(strSQL,con))
    {
        cmd.Parameters.Add("@Username", SqlDbType.NVarChar).Value = txtusername.Text;
        con.Open();
        dt.Load(cmd.ExecuteReader());

        if (dt.Rows.Count > 0)
        {
            // already exists
            sResult = "User Already Exists";
        }
        else
        {
            // does not exist, lets add it
            DataRow NewRow = dt.NewRow();
            NewRow["FName"] = txtname.Text;
            NewRow["@Email"] = txtmail.Text;
            NewRow["Username"] = txtusername.Text;
            NewRow["Password"] = txtPassword.Text;
            dt.Rows.Add(NewRow);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            SqlCommandBuilder daU = new SqlCommandBuilder(da);
            da.Update(dt);
            sResult = "User added");
        }
    }
}
Lblmsg.Text = sResult;
Response.Write("$<script>alert('{sResult}')</script>");

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 2013-04-30
    • 2010-12-28
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多