bjh
bjh

Reputation: 59

When ASP.NET username exists, change to username(x)

Using SQL Membership Provider for ASP.NET membership. I'm using first.last as the username, which is created programmatically from the user details filled in on a form.

When user submits the form, I want to be able to check if the username exists, and change it to username1 if it does, check username1 exists, and make it username2 if it exists, etc. until it is a unique username.

I don't know how to do stored procedures, so I'm trying to use a SQLDataReader to check if username exists.

The problem is my loop. The logic is basically to set a boolean and keep looping and adding 1 to the counter, until it doesn't find a duplicate. I have stepped through this many times, and even when it sets the boolean to false, it keeps looping.

Ideas please?

Code behind:

protected void Membership_add()
{
    SqlConnection con = new SqlConnection(connectionString);
    string NewUserNameString = FirstName.Text + "." + LastName.Text;

    //Check for duplicate aspnet membership name and add a counter to it if exists
    // Check for valid open database connection before query database
    bool match = true;
    SqlDataReader _SqlDataReader = null;
    string TestNameString = NewUserNameString;
    string selectDupeString = "SELECT UserId FROM aspnet_Users WHERE UserName = '" + TestNameString + "'";
    SqlCommand SQLdatareaderCmd = new SqlCommand(selectDupeString, con);
    int UserNameCounter = 0;
    con.Open();
    while (match = true)
    {
        //Open the connection

        try
        {
            //Read the table
            _SqlDataReader = SQLdatareaderCmd.ExecuteReader();
        }
        catch (Exception ex)
        {
            lblDatareaderEx.Text = "An Exception occurred. " + ex.Message + " " + ex.GetType().ToString();
        }

        if (_SqlDataReader.HasRows)
        {
            //match = true;
            //increase counter by 1 for each record found and change First.Name to First.Namex
            TestNameString = NewUserNameString;
            UserNameCounter = UserNameCounter + 1;
            TestNameString = TestNameString + UserNameCounter.ToString();
            _SqlDataReader.Close();
            _SqlDataReader.Dispose();
            selectDupeString = "SELECT UserId FROM aspnet_Users WHERE UserName = '" + TestNameString + "'";
            SQLdatareaderCmd = new SqlCommand(selectDupeString, con);
        }
        else
        {
            // close sql reader
            _SqlDataReader.Close();
            _SqlDataReader.Dispose();
            //get out of loop
            match = false;
        }
    }
    con.Close();
    con.Dispose();
}

Upvotes: 0

Views: 1154

Answers (3)

Phil Bolduc
Phil Bolduc

Reputation: 1

If you break your code out into smaller blocks, the code becomes simpler and easer to read.

private string MembershipAddUser(string firstName, string lastName)
{
    string username = firstName + "." + lastName;

    int i = 0;
    while (UserExists(username))
    {
        i++;
        username = firstName + "." + lastName + i.ToString();
    }

    return username;
}

private bool UserExists(string username)
{
    string sql = "SELECT COUNT(*) FROM dbo.aspnet_Users WHERE UserName = @UserName";

    SqlConnection connection = new SqlConnection(connectionString);

    SqlCommand command = new SqlCommand(sql, connection);
    command.Parameters.AddWithValue("@UserName", username);

    using (connection)
    {
        connection.Open();

        int count = (int) command.ExecuteScalar();
        return (count != 0);
    }
}

Upvotes: 0

Nuffin
Nuffin

Reputation: 3972

This line:

while (match = true)

does an assignment.
If you want your code to work you have to do a comparison:

while (match == true)

Or, since your variable is already a bool, you can just use the variable directly:

while(match)

Upvotes: 1

Dan
Dan

Reputation: 5637

At the moment you're setting match rather than comparing it's value.

Try setting while (match = true) to while (match == true)

Upvotes: 0

Related Questions