2012-01-25 5 views
0

Использование поставщика членства SQL для членства в ASP.NET. Я использую first.last как имя пользователя, которое создается программно из деталей пользователя, заполненных формой.Когда имя пользователя ASP.NET существует, измените на имя пользователя (x)

Когда пользователь отправляет форму, я хочу, чтобы проверить, существует ли имя пользователя, и изменить его на username1, если это так, проверьте имя пользователя1 и укажите его имя пользователя2, если оно существует, и т. Д., Пока оно не станет уникальным имя пользователя.

Я не знаю, как выполнять хранимые процедуры, поэтому я пытаюсь использовать SQLDataReader для проверки того, существует ли имя пользователя.

Проблема в моей петле. Логика в основном заключается в том, чтобы установить логическое значение и продолжить цикл и добавить 1 к счетчику, пока он не найдет дубликат. Я прошел через это много раз, и даже когда он устанавливает значение boolean в false, он продолжает цикл.

Идеи, пожалуйста?

код позади:

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(); 
} 
+0

Вы можете правильно выровнять фигурные скобки? его трудно прочитать outhere –

+0

Вы считали, что произойдет, если два человека с одним и тем же базовым именем попытаются запустить это одновременно - они могут найти то же значение, что и новое имя, которое, очевидно, не будет выполнено для одного из них, когда вы на самом деле попытайтесь настроить их. –

ответ

1

Эта строка Try:

while (match = true) 

делает задание.
Если вы хотите, чтобы ваш код для работы вы должны сделать сравнение:

while (match == true) 

Или, так как переменная уже BOOL, вы можете просто использовать переменную непосредственно:

while(match) 
+0

Спасибо 'match == true'! Я не знал, что мне пришлось использовать сравнение (или какая разница была b/w = и ==), так что спасибо v много. – bjh

0

На данный момент вы заходящего match, а не сравнивая его значение.

установка while (match = true) к while (match == true)

+0

В этом случае OP должен получить предупреждение о компиляторе. так как это предложит использовать оператор сравнения в заявлении условия. –

+0

@ Ravi - очевидно, в этом случае предупреждения должны быть проигнорированы. –

0

Если вы разбить код на более мелкие блоки, код становится проще и легче читать.

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); 
    } 
} 
+0

Я пробовал этот подход, но не мог понять, как передать строку/bool. – bjh

+0

string newUsername = MembershipAddUser (FirstName.Text, LastName.Text); // note, метод MembershipAddUser должен был быть вызван как GetUnusedUsername (строка firstName, string lastName). Вы все еще несете ответственность за добавление пользователя. –

Смежные вопросы