2016-04-10 17 views
0

Okey、私はここで完全に明白な何かが不足していると思います。私はそれを見るために新鮮な目のペアが必要です、私は疲れています。C#ユーザー名の比較(2文字列)

文字通り、if文で2文字列を比較していますが、同じものとは思えません。

public Boolean checkusn(String username) 
    { 
     MySqlDataReader reader = sendcmd("SELECT username FROM `users`"); 
     Boolean taken = true; 
     while (reader.Read()) 
     { 
      for (int i = 0; i < reader.FieldCount; i++) 
      { 
       Console.Write(reader.GetString(i) + " " + username + " "); 
       if (username == reader.GetString(i)) 
       { 
        taken = false; 
        label17.Text = "Username already taken"; 
       } 
       else 
       { 
        taken = true; 
        label17.Text = "Username not taken"; 
       } 

      } 
     } 
     return taken; 
    } 

出力は次ある:

hayhay hayhay test hayhay 

そう試験とhayhayとhayhayとの比較hayhay。 しかし、それは同じようにそれらを考えていません....

+1

使用 'string.Equals(string2の)'デフォルトでは、SQLのテキスト比較は大文字と小文字を区別しないですが、C#で、それは大文字と小文字が区別だと – Tdorno

+0

注意==ません。 – Dai

+4

'taken = false'と' taken = true'は間違った方向にあります。ブレークポイントを使用する方法とコードをステップ実行する方法を学習する必要があります。人生はずっと楽になります。 https://msdn.microsoft.com/en-us/library/5557y8b4.aspx –

答えて

2

私は懸念に対処する方法を簡略化し、保守や理解を容易にすることを願っています。変更点は以下のとおりです。パラメータで渡されたことを確認し

  • 正しい論理エラー(見つかったときにループから抜け出す)
  • は、実際には明示的に行う
  • (少なくとも今の主要/末尾のスペースが削除される)何らかの方法で確認されます大文字小文字を区別しない比較(希望する場合はstring.compareを使用することができます)
  • コード削減

    public bool checkusn(String username) 
    { 
        MySqlDataReader reader = sendcmd("SELECT username FROM `users`"); 
        int foundCount = 0; 
        string usernamePassedIn = username.Trim().ToUpper(); 
    
        while (reader.Read() && foundCount == 0) 
        { 
         for (int i = 0; i < reader.FieldCount; i++) 
         { 
          string usernameReadFromDb = reader.GetString(i).Trim().ToUpper(); 
          if (usernamePassedIn == usernameReadFromDb) 
           foundCount++; 
          if (foundCount > 0) 
           break; 
         } 
        } 
    
        label17.Text = foundCount > 1 ? "Username already taken" : "Username not taken"; 
        return foundCount > 0; 
    } 
    

ユーザー名UPPER CASEDとTRIMMEDをデータベースから直接返すことで、さらに改善できます。また、パラメータusernameがNULLまたは空の場合も考慮に入れないことに注意してください。

あなたが試合を見つけた回数を数えることによって、必要に応じて他のことを行うことができます。そのため、ループのすぐ前に壊れてしまうのではなく、

私はあなたがそこで使っているMySQLリーダーの専門家ではありませんが、1つのフィールドを返すと、フィールド上でFORループをしているとちょっと奇妙に思えます。あなたのループFOR完全にすなわちで:

public bool checkusn(String username) 
    { 
     MySqlDataReader reader = sendcmd("SELECT username FROM `users`"); 
     int foundCount = 0; 
     string usernamePassedIn = username.Trim().ToUpper(); 

     while (reader.Read() && foundCount == 0) 
     { 
       string usernameReadFromDb = reader.GetString(0).Trim().ToUpper(); 
       if (usernamePassedIn == usernameReadFromDb) 
        foundCount++; 
      } 

     label17.Text = foundCount > 1 ? "Username already taken" : "Username not taken"; 
     return foundCount > 0; 
    } 
+0

forループは、データベースからプルされた各ユーザー名をループするために使用されます。各結果が参照されます.GetString(この番号は各検索結果を参照します)結果は大規模なデータベースでは非効率に見えるかもしれませんが、私は素人です。D – hayhay

+0

結果セットの各レコードにアクセスしているRead()と各レコードには1つのフィールドしかありませんか? 1つ以上のフィールドにループしますか?私はあなたのFieldCountが常に1であると推測しています:-) – TheEdge

+0

フィールドカウントは、データベースに存在するユーザー名の数です。そして、読んだら - https://msdn.microsoft.com/en-us/library/system.data.idatareader.read.aspx – hayhay

0

ます。文字列を比較するとき、あなたが明示的に指定したメソッドを使用する必要があります。このMSDN article

から==

を使用しないでくださいどのような比較をあなたが実行しようとしているのか。これにより、コードはずっとメンテナンスと読み込みが容易になります。可能な限り、StringComparison列挙型パラメータを受け取るSystem.StringおよびSystem.Arrayクラスのメソッドのオーバーロードを使用して、実行する比較の種類を指定できるようにします。文字列を比較するときは、==演算子と!=演算子を使用しないでください。また、String.CompareToインスタンスメソッドの使用は避けてください。オーバーロードのいずれもStringComparisonを使用しないためです。

+0

誰かがこの問題に関するマイクロソフト独自のアドバイスを下落させた...素晴らしい。 – RJM

+1

言語を書いて維持する人々は間違っているはずです。私はバランスをとるためにアップアップします。 – Tdorno

+0

あなたが文字列を比較するとき、あなたや他の値は 'オブジェクト'ではなく、オブジェクトequalityを比較するときに '=='を使います。 '.Equals'メソッドを使用します。 – MethodMan

3

撮影したときにループを残します。== true。 今では、常に表の最後の要素のbool値のみを返しています。

0

ヒントの人に感謝、私はC#を頻繁に使用しないでください。あなたが言及したことは事実ではありませんでしたが、それは私の間違いを見つけるのを助けました。

ユーザ名が見つかったら、私は愚かにforループを止めていなかったので、リストの次のユーザ名に向かうとtrueに戻していました。

+0

ahあなたのコメントをFlottの後に見ました。ありがとう! – hayhay