0

学校のプロジェクトに取り組んでいる私は本当にあなたの助けが必要です. データを保存した後、SqlDataReaderを使用してデータを保存します(そして、sqldatareaderの結果ビューをデバッグしているときにチェックしましたが、データがいっぱいです)、すべてのデータを持つsqldatareader変数を使用しようとすると、直接空になります?? if 行に到達する前に、私の sqlreader にはすべてのデータが含まれていますが、if 行をデバッグすると、sqlreader が空であることが示されます。

 class ServicesProvider
    {
     public static SqlConnection connection = new SqlConnection(myprovider);
      public static bool LogInVerification(string NickName,string Password)
        {
            SqlDataReader SqlReader;
            SqlCommand command;
            try
            {
                command = new SqlCommand("Check_LogIn", connection);
                command.CommandType = CommandType.StoredProcedure;

            SqlParameter prm=null;
            prm = new SqlParameter("@Password", SqlDbType.VarChar);
            prm.Value=NickName;
            prm.Direction=ParameterDirection.Input;
            command.Parameters.Add(prm);

            prm = new SqlParameter("@NickName", SqlDbType.VarChar);
            prm.Value=Password;
            prm.Direction=ParameterDirection.Input;
            command.Parameters.Add(prm);

            try
            {
                connection.Open();
                SqlReader = command.ExecuteReader();

                    if (SqlReader["NickName"].ToString()== "1")
                return true;;
            }
            catch (Exception ERROR)
            {
                Console.WriteLine(ERROR.Message);
            }

        }
        catch (Exception error)
        {
            Console.WriteLine(error.Message);
        }
        return false;
    }
}
4

1 に答える 1

6

このコードが問題です:

SqlReader = command.ExecuteReader();
if (SqlReader["NickName"].ToString()== "1")

ExecuteReader返されると、リーダーは最初の結果のに配置されます。Read結果を読み取るには、呼び出す必要があります。通常は次のようになります。

using (SqlDataReader reader = command.ExecuteReader())
{ 
    while (reader.Read())
    {
        // Handle the data for this row
    }
}

ノート:

  • 単一の値のみを読み取りたい場合は、使用を検討してくださいExecuteScalar
  • using使い捨てリソース (接続、コマンド、リーダー) ごとにステートメントが必要です。
  • ローカル変数は慣習的にキャメルケースです (パスカルケースのようなものではありませんSqlReader) 。
  • 単一の静的接続を使用することは、本当に悪い考えです。データベース操作を実行するたびに接続を作成して開き、その操作が完了したら破棄します (これはusingステートメントで自動的に行われます) 。
  • おそらくパスワードをプレーンテキストで保存しているようですこれは明らかにセキュリティ上の大きな問題です。
于 2013-03-30T17:05:41.520 に答える