если в операторе выдает логику оператора if else - PullRequest
0 голосов
/ 07 мая 2019

В моей хранимой процедуре есть несколько 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 разных сообщения с использованием регистра переключателя (используются только -2 и 0, -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игнорируются.

Однако первый оператор процедуры else, если он немного странный, на стороне базы данных работает нормально, он корректно проверяет условия перед вставкой значений.

Но case 0 не работает, вместо этого запускается case -2.

Переменные: @Username = имя пользователя @b = имя события

столбец зарегистрированных пользователей: имя пользователя, имя события

Я проверяю, существует ли пользователь в таблице registeredusers и нетне существует в registered, следовательно, 2 оператора if вместе.

1 Ответ

3 голосов
/ 07 мая 2019

(используются только -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...