存储过程中是否存在语句逻辑问题

时间:2019-05-07 05:40:43

标签: c# sql asp.net

我的存储过程中有多个IF...ELSE语句,但是一次只能使用2条吗?

存储过程:

IF  EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)
  IF NOT EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
  BEGIN
    select 0
    INSERT INTO [registered]
        ([Username]
        ,[CreatedDate]
        ,[eventname])
    VALUES
        (@Username
        ,GETDATE()
        ,@b)
  END
  ELSE IF  NOT EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)
  BEGIN
    SELECT -1 -- invalid user
  END
  ELSE IF  EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
  BEGIN
    SELECT -2 -- username
  END

具有3个不同消息(使用切换例)的帖子前页(仅使用-20-1被完全忽略)。 如果用户不存在,它将不会选择-1

即使它不正确,它也将使用会话值转到页面上方。

protected void RegisterUser(object sender, EventArgs e)
{
    int userId = 0;
    string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand("Insert_User"))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.Connection = con;
                con.Open();

                Session["username"] = txtUsername.Text;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Username", txtUsername.Text.Trim());
                cmd.Parameters.AddWithValue("@b", DropDownList1.SelectedValue.ToString());

                if (!DBNull.Value.Equals(cmd.ExecuteScalar()))
                {
                    userId = Convert.ToInt32(cmd.ExecuteScalar());
                }
            }

            string messages = string.Empty;
            switch (userId)
            {
                case 0:
                    Response.Redirect("userinfo.aspx", false);
                    break;
                    Label2.Text = Convert.ToString(userId);
                case -1:
                    messages = "invalid user";
                    Label2.Text = Convert.ToString(userId);
                    break;
                case -2:
                    messages = "You've already registered!";
                    Label2.Text = Convert.ToString(userId);
                    //Label2.Text = messages;
                    break;
            }
        }
    }
}

发布页面的代码后面

protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = Convert.ToString(Session["username"]);

    string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    using (SqlCommand scmd = new SqlCommand())
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            scmd.Connection = con;
            scmd.CommandType = CommandType.Text;
            scmd.Parameters.Add("@b", SqlDbType.NVarChar).Value = Label1.Text;
            scmd.CommandText = "SELECT * FROM registered where username = @b";
            con.Open();
        }
    }
}

回复布伦丹: select --1 invalid user未被执行,而是被发布到下一页,这意味着case -1被忽略。

但是,该过程的第一个if else语句有点奇怪,在数据库方面,它运行良好,可以正确地在插入值之前检查条件。

但是case 0不起作用,它会触发case -2

变量: @Username =用户名 @b =事件名称

“注册用户”列:用户名,事件名

我正在检查registeredusers表中是否存在用户,而registered中不存在用户,因此将2条if语句放在一起。

1 个答案:

答案 0 :(得分:3)

(仅使用-2和0,完全忽略-1)。如果用户不存在,则不会选择-1。原因是第一个语句,即:

IF  EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)

在其中检查条件是否存在,然后继续。如果用户不存在,它将如何进入其他语句。您可以为此编写一个其他部分

IF  EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)
BEGIN
  IF NOT EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
  BEGIN
   INSERT INTO [registered]
        ([Username]
        ,[CreatedDate]
        ,[eventname])
    VALUES
        (@Username
        ,GETDATE()
        ,@b)
    select 0
  END      
  ELSE IF  EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
  BEGIN
    SELECT -2 -- username
  END
END
ELSE
  BEGIN
    SELECT -1 -- invalid user
  END