3

私はC#の初心者です。MySQLデータベースとVisualC#2010にXAMPPサーバーを使用しています。次に、phpMyAdminに「testdb」という名前のデータベースと「login」という名前のテーブルを作成しました。ユーザー名とパスワードをテーブルに挿入しました。ユーザー名とパスワード用の2つのテキストボックスとボタンを作成する単純なWinFormログインを実行しています。コードを実行しましたが、コンパイラエラーはありません。しかし、私は一列で問題を抱えていました。「指定されたMySQLホストのいずれにも接続できません」と表示されます。MySql.Dataを参照に追加しました。ログインするときにデータベーステーブルのデータを取得したいのですが、ユーザーを承認するか、一致しない場合はエラーメッセージが表示されます。

これが私のコードです:

using MySql.Data.MySqlClient; 

public bool Login(string username, string password)
{
    MySqlConnection con = new MySqlConnection("host=localhost;username…");
    MySqlCommand cmd = new MySqlCommand("SELECT * FROM login WHERE username='" +
                                      username + "' AND password='" + password + "';");

    cmd.Connection = con;

    con.Open(); // This is the line producing the error.

    MySqlDataReader reader = cmd.ExecuteReader();

    if (reader.Read() != false)
    {    
        if (reader.IsDBNull(0) == true)
        {
            cmd.Connection.Close();
            reader.Dispose();
            cmd.Dispose();
            return false;
        }    
        else
        {
            cmd.Connection.Close();
            reader.Dispose();
            cmd.Dispose();
            return true;
        }    
    }    
    else
    {
        return false;
    }    
}

*フィードバックをお待ちしております。:)

4

3 に答える 3

17

当面の問題は、おそらく接続文字列が正しくないか、データベース サーバーが利用できないことです。接続文字列は次のようになります

Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;

実際の値<username><password>置き換えてください。

それに加えて、コードにはいくつかの問題があり、これが製品コードになることを意図している場合、およびおそらくこれが何かを学ぶためのおもちゃのプロジェクトである場合でも、それらを確実に調査する必要があります。リストは特定の順序であり、包括的ではない場合があります。

  1. 接続文字列をハードコーディングしないでください。代わりに、構成ファイルに移動します。
  2. 構成ファイルまたはソース コードにプレーン テキストのパスワードを含めないでください。Windows 認証、証明書、またはWindows Data Protection APIによって保護されたパスワードなど、さまざまなソリューションがあります。
  3. IDisposableを呼び出すだけでインスタンスを破棄しないでくださいIDisposable.Dispose()代わりに、usingステートメントを使用して、例外が発生した場合でもリソースを解放してください。
  4. 文字列操作技術を使用して SQL ステートメントを作成しないでください。代わりSqlParameterに、SQL インジェクション攻撃を防ぐために使用します。
  5. 平文のパスワードをデータベースに保存しないでください。代わりに、少なくともパスワードのソルト ハッシュを保存し、MD5 や SHA ファミリーのメンバーではなく、低速のハッシュ関数を使用します。
  6. を使用IDbCommand.ExecuteScalarしてスカラー結果を取得し、データ リーダーの使用を避けることができます。
  7. ブール値をtrueorと比較することfalseは冗長であり、コードにノイズを追加するだけです。代わりにif (reader.IsDBNull(0) == true)を使用できますif (reader.IsDBNull(0))。同じことがandif (reader.Read() != false)に相当するものにも当てはまります。if (reader.Read() == true)if (reader.Read())
  8. Entity Frameworkのような O/R マッパーを使用することは、通常、SQL コマンドのレベルでデータベースとやり取りするよりも好まれます。
于 2013-02-11T03:19:07.163 に答える
2

標準の MySQL ConnectionString に応じて ConnectionString を変更してみてください。

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

ソース: MySQL 接続文字列

C# を使用して MySQL データベースに接続する方法を示す次のリンクも参照してください。

コネクタ/ネット接続文字列の作成 (MYSQL)

于 2013-02-10T20:22:21.843 に答える