Проверьте, существует ли имя пользователя в asp.net, используя хранимую процедуру и добавив значения в Registration.aspx.

Я создал хранимую процедуру в SQL Server, чтобы проверить, существует ли имя пользователя в базе данных:

CREATE PROCEDURE [dbo].[spCheckUsernameForAnswer]
     @username VARCHAR(30)
AS
BEGIN
    DECLARE @count INT

    SELECT @count = COUNT(username) 
    FROM Users 
    WHERE [username] = @username 

    IF (@count = 1)
    BEGIN
        SELECT 1 AS ReturnCode
    END
    ELSE
    BEGIN
        SELECT 0 AS Returncode
    END
END

Вот что я сделал в Visual Studio Registration.aspx.cs.

Мне нужно проверить, существует ли имя пользователя, и если нет, вставить необходимые значения в БД, чтобы зарегистрировать нового пользователя.

Из приведенного ниже кода он продолжает регистрировать новых пользователей с одним и тем же именем пользователя снова и снова.

Есть идеи, что мне здесь не хватает?

protected void Button1_Click(object sender, EventArgs e)
{
    try
    {
        Guid newGUID = Guid.NewGuid();

        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);

        SqlCommand cmd = new SqlCommand("spCheckUsernameForAnswer", conn);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter parausername = new SqlParameter("@username", TextBoxUN.Text);
        cmd.Parameters.Add(parausername);

        conn.Open();

        SqlDataReader rdr = cmd.ExecuteReader();

        while (rdr.Read())
        {
            if (Convert.ToBoolean(rdr["ReturnCode"]))
            {
                Label1.Text = "Username found";
            }
            else
            {
                Label1.Text = "not found";
            }
        }

        conn.Close();

        SqlConnection conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);

        conn1.Open();

        string insertQuery = "insert into [Users] (user_id, first_name, last_name, email, username, password) values (@user_id, @first_name, @last_name, @email, @username, @password)";

        SqlCommand com = new SqlCommand(insertQuery, conn1);

        com.Parameters.AddWithValue("@user_id", newGUID.ToString());
        com.Parameters.AddWithValue("@first_name", TextBoxFname.Text);
        com.Parameters.AddWithValue("@last_name", TextBoxLname.Text);
        com.Parameters.AddWithValue("@email", TextBoxEmail.Text);
        com.Parameters.AddWithValue("@username", TextBoxUN.Text);
        com.Parameters.AddWithValue("@password", TextBoxPass.Text);

        com.ExecuteNonQuery();

        Response.Write("Registration successful");

        conn1.Close();
    }
}
catch (Exception ex)
{
    Response.Write("Error:" + ex.ToString());
}

person G. Hari    schedule 30.01.2018    source источник


Ответы (4)


Лучше использовать cmd.ExecuteScalar, так как sp возвращает либо 1, либо 0.

И было бы лучше иметь insert into db part в отдельном методе, таком как метод RegisterUser.

Но главное, вам нужно вызвать этот метод, когда он не существует в БД (в операторе else)

protected void Button1_Click(object sender, EventArgs e)
{
    try
    {         
        using(var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString))
        {
            using(var cmd = new SqlCommand("spCheckUsernameForAnswer", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@username", TextBoxUN.Text));
                conn.Open();
                var returnCode = Convert.ToInt32(cmd.ExecuteScalar());
                if(returnCode == 1)
                {
                    Label1.Text = "Username found";
                }
                else
                {
                    Label1.Text = "not found";
                    Register();
                }
            }
        }               
    }
    catch (Exception ex)
    {
        Response.Write("Error:" + ex.ToString());
    }
}

private void RegisterUser()
{
    try 
    {
        var newGUID = Guid.NewGuid();
        using(var conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString))
        {
            conn1.Open();
            string insertQuery = "insert into [Users] (user_id, first_name, last_name, email, username, password) values (@user_id, @first_name, @last_name, @email, @username, @password)";
            using(var com = new SqlCommand(insertQuery, conn1))
            {
                com.Parameters.AddWithValue("@user_id", newGUID.ToString());
                com.Parameters.AddWithValue("@first_name", TextBoxFname.Text);
                com.Parameters.AddWithValue("@last_name", TextBoxLname.Text);
                com.Parameters.AddWithValue("@email", TextBoxEmail.Text);
                com.Parameters.AddWithValue("@username", TextBoxUN.Text);
                com.Parameters.AddWithValue("@password", TextBoxPass.Text);
                com.ExecuteNonQuery();
            }
        }
        Response.Write("Registration successful");
    }
    catch (Exception exc)
    {
        //log the exception;
    }
}
person Daniel B    schedule 31.01.2018
comment
большое спасибо за вашу помощь, отредактированный код сработал отлично! Я пытался исправить это в течение нескольких часов, я знал, что что-то напутал, но я не знал, что и где. Высоко ценим вашу помощь! - person G. Hari; 31.01.2018
comment
@ G.Hari рад, что смог помочь. Удачного кодирования - person Daniel B; 31.01.2018

Попробуйте это, не слишком уверен, почему вы использовали читатель, если бы я был, вы будете обрабатывать все в хранимой процедуре

protected void Button1_Click(object sender, EventArgs e)
{
  try
  {

    Guid newGUID = Guid.NewGuid();

    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
    SqlCommand cmd = new SqlCommand("spCheckUsernameForAnswer", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter parausername = new SqlParameter("@username", TextBoxUN.Text);
    cmd.Parameters.Add(parausername);
    conn.Open();
    var userexsist = (bool)cmd.ExecuteScalar();
    if (userexsist)
    {

        Label1.Text = "Username found";
        conn.close();
    }
    else
    {
        Label1.Text = "not found";


        string insertQuery = "insert into [Users] (user_id, first_name, last_name, email, username, password) values (@user_id, @first_name, @last_name, @email, @username, @password)";
        SqlCommand com = new SqlCommand(insertQuery, conn);
        com.Parameters.AddWithValue("@user_id", newGUID.ToString());
        com.Parameters.AddWithValue("@first_name", TextBoxFname.Text);
        com.Parameters.AddWithValue("@last_name", TextBoxLname.Text);
        com.Parameters.AddWithValue("@email", TextBoxEmail.Text);
        com.Parameters.AddWithValue("@username", TextBoxUN.Text);
        com.Parameters.AddWithValue("@password", TextBoxPass.Text);
        com.ExecuteNonQuery();
        Response.Write("Registration successful");
        conn.Close();
    }        
  }
  catch (Exception ex)
  {
    Response.Write("Error:" + ex.ToString());
  }
}
person charithsuminda    schedule 31.01.2018

Вы также можете управлять им в хранимой процедуре. Найти решение:

USE [akhil_db]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Sp_Insert_AddUser] 
(  
@fname varchar(200),
@lname varchar(200),
@userName varchar(200),
@userEmail varchar(200),  
@userPasword varchar(200),  
@userType varchar(200),
 @msg VARCHAR(100) OUT )  
AS  
BEGIN  
SET NOCOUNT ON;  
Declare @UserCount int;
SELECT @UserCount = COUNT(*) FROM user_master WHERE [user_name] = @userName or [user_email]=@userEmail;
IF(@UserCount > 0)
begin

 Set  @msg = 'User already exists';

end
ELSE
begin

Insert into user_master(
        user_fname,
        user_lname,
      [user_name]
      ,[user_email]
      ,[user_pasword]
     ,user_type
      )
       values(
        @fname,
        @lname,
       @userName
      ,@userEmail
      ,@userPasword
     ,@userType

      )
      SET @msg ='Registered Successfully'
END 
END 



Code behind c#



SqlCommand cmd = new SqlCommand("Sp_Insert_AddUser", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@fname", txtfname.Text);
            cmd.Parameters.Add("@lname", txtlname.Text);
            cmd.Parameters.AddWithValue("@userName", txtUserName.Text);
            cmd.Parameters.AddWithValue("@userEmail", txtUserEmail.Text);
            cmd.Parameters.AddWithValue("@userPasword", txtPass.Text);
            cmd.Parameters.AddWithValue("@userType", ddlUserType.SelectedValue);

            cmd.Parameters.Add("@msg", SqlDbType.Char, 500);
            cmd.Parameters["@msg"].Direction = ParameterDirection.Output;
            con.Open();
            cmd.ExecuteNonQuery();
            string message = (string)cmd.Parameters["@msg"].Value;
            lblMessage.Visible = true;
            lblMessage.Text = message;

            con.Close();
person Akhil Singh    schedule 31.01.2018

Я ИСПОЛЬЗУЮ ПОМОЩНИК КЛАССА VS. СКОРО Я ПРИШУ АЛЬТЕРНАТИВНОЕ РЕШЕНИЕ

SqlHelper sho = new SqlHelper();
public bool alreadyexist()
        {
string[] str = { "@catname", "@proname" };       
string[] obj = { comboproductname.Text, comboitemname.Text };

SqlDataReader sdrr = sho.GetReaderByCmd("sp_item_alreadyex", str, obj);

if (sdrr.Read())
{
    sdrr.Close();
    sho.CloseConnection();
    return true;
}
else
{
    sdrr.Close();
    sho.CloseConnection();
    return false;
}

Хранимая процедура:

Create procedure [dbo].[sp_item_alreadyex]
    @catname nvarchar(50),
    @proname nvarchar(50)
as
begin
    select * 
    from Item 
    where Item_Name = @proname and Category = @catname
end
person ruthra    schedule 31.01.2018
comment
Примечание: вы не должны не использовать префикс sp_ для своих хранимых процедур. Microsoft зарезервировала этот префикс для собственного использования ( см. Именование хранимых процедур), и вы рискуете столкнуться с конфликтом имен в будущем. Это также плохо сказывается на производительности ваших хранимых процедур. Лучше просто избегать sp_ и использовать в качестве префикса что-то другое - или вообще не использовать префикс! - person marc_s; 31.01.2018
comment
Пожалуйста, не отклоняйте и не откатывайте изменения, чтобы правильно отформатировать код. (И, в будущем, пожалуйста, сами правильно оформляйте свои сообщения.) Спасибо. - person elixenide; 18.11.2018