C# 存储过程中的if-else语句逻辑问题

C# 存储过程中的if-else语句逻辑问题,c#,sql,asp.net,C#,Sql,Asp.net,我的存储过程中有多个IF…ELSE语句,但显然一次只能使用两个 存储过程: 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 [registe

我的存储过程中有多个
IF…ELSE
语句,但显然一次只能使用两个

存储过程:

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
使用一个开关盒(仅使用
-2
0
,完全忽略
-1
)的包含3条不同消息的预发布页面。 如果用户不存在,它不会选择
-1

它只是带着会话值转到post over页面,即使它不正确

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无效用户
没有被执行,它被发布到下一页,这意味着
case-1
被忽略

然而,过程的第一个if-else语句有点奇怪,在数据库端,它工作正常,在插入值之前正确地检查了条件

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

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

注册用户列:用户名、事件名称

我正在检查用户是否存在于
registeredusers
表中,而不存在于
registeredusers
中,因此将两个if语句放在一起

(仅使用-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

你能提供更多的细节吗?如果没有执行过程中的哪个
,对于给定的代码块,变量是什么(例如
@Username
)以及
注册表项的内容是什么
表?添加了对主帖子的回复,以便更容易看到现在使用了案例-2和-1。案例0被忽略。数据库仍在正确插入值,但未选择0。首先在IF NOT EXISTS块中写入insert语句,然后写入select语句,如select 0Not working still,它只是忽略select 0,然后跳到-2。(IMO)感觉它在循环,它永远不会跳到0。因此,与插入后一样,它将再次循环语句,覆盖0并转到-2(因为用户现在存在)。您是否可以编写打印语句,而不是通过执行存储过程在输出窗口中选择和检查输出(根据需要传递不同的参数)在数据库中,查看它发生的原因。我在我的末端尝试了相同的方法,并按预期工作。