3

ASP.NET Web サイトでログイン フォームを作成しようとしています。現在、問題が発生しています。ログインしたユーザーが自分のプロフィールのみを表示する権限を持つように、機能を組み込んでいます。ログインページのコードは次のとおりです。

business.clsprofiles obj = new business.clsprofiles();
        Int32 a = obj.logincheck(TextBox3.Text, TextBox4.Text);
        if (a == -1)
        {
            Label1.Text = "Username/Password incorrect";
        }
        else
        {
            Session["cod"]= a;
            Response.Redirect("profile.aspx");
        }

ログイン後、ユーザーはログイン後に自分のプロフィールを表示できるページに移動します。セッションは、ログインページからログインした人の値を正しく取得し、それを次のページに正常に渡します。grid_bind()しかし、ここのプロフィールページでエラーが発生し、以下の方法のどこかに問題があると思います

public void grid_bind()
{
    business.clsprofiles obj = new business.clsprofiles();
    List<business.clsprofilesprp> objprp = new List<business.clsprofilesprp>();
    Int32 z = Convert.ToInt32(Session["cod"]);
    objprp = obj.fnd_profiles(z); //This line of code is passing an integer as required but does not get the desired result from the database
    GridView1.DataSource = objprp;
    GridView1.DataBind();
}

ビジネスロジックのエラーが言うように、「drにデータが存在しない場合、無効な読み取り試行です」

public List<clsprofilesprp> fnd_profiles(Int32 id)
        {
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            SqlCommand cmd = new SqlCommand("fndpro", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
            SqlDataReader dr = cmd.ExecuteReader();
            List<clsprofilesprp> obj = new List<clsprofilesprp>();
            while(dr.HasRows)
            {
                clsprofilesprp k = new clsprofilesprp();

                k.id = Convert.ToInt32(dr[0]);//Something wrong here?

                k.name = dr[1].ToString();
                k.password = dr[2].ToString();
                k.description = dr[3].ToString();
                k.created = Convert.ToDateTime(dr[4]);
                k.modified = Convert.ToDateTime(dr[5]);
                obj.Add(k);
            }
            dr.Close();
            cmd.Dispose();
            con.Close();
            return obj;
        }lesprp k = new clsprofilesprp();

        k.id = Convert.ToInt32(dr[0]);//Something wrong here?

                k.name = dr[1].ToString();
                k.password = dr[2].ToString();
                k.description = dr[3].ToString();
                k.created = Convert.ToDateTime(dr[4]);
                k.modified = Convert.ToDateTime(dr[5]);
                obj.Add(k);
            }
            dr.Close();
            cmd.Dispose();
            con.Close();
            return obj;
4

3 に答える 3

11

DataReader.Read結果を取得するには、次のように呼び出す必要があります。

SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
// ...

DataReader.Readブール値を返すため、結果が複数ある場合は、次のことができます。

While (dr.Read())
{
  // read data for each record here
}

さらに、コードのこの部分に何もない場合、dr データにアクセスしようとしています。

k.id = Convert.ToInt32(dr[0]);//Something wrong here?
k.name = dr[1].ToString();
k.password = dr[2].ToString();
k.description = dr[3].ToString();
k.created = Convert.ToDateTime(dr[4]);
k.modified = Convert.ToDateTime(dr[5])
于 2011-01-07T18:06:36.387 に答える
3

問題があります...

while (dr.HasRows)
{
   /* If this loop is entered, it will run 
    * indefinitely until the datareader miraculously 
    * loses all its rows in a hole somewhere */
}

これは決して入らないか、無限ループを作成します...行がないか、行があります。私があなたが意味したと思うのは:

while (dr.Read())
{
   /* Do something with the current record */
}

dr.Read()次のレコードにループし、読み取るレコードがあるかどうかに応じて true または false を返します。データ リーダーが初期化されると、最初のレコードは選択されませんdr.Read()これは、最初の行が見つかった場合に true を返す呼び出しによって選択する必要があり、現在最後の行にあるときに Read() が呼び出されるまで、つまり、読み取る行がなくなるまで true を返します。

dr.HasRowsは、データリーダーに行が含まれているかどうかを示す単なるプロパティです...含まれている場合、ここから永遠に行が保持されます。たとえば、行があるイベントで何かを行い、行がないイベントで別のことをしたい場合は、これを使用します。

if (dr.HasRows)
{
    while (dr.Read())
    {
        /* Display data for current row */
    }
}
else
{
    Console.WriteLine("I didn't find any relevant data.");
}
于 2011-01-07T18:14:45.837 に答える
0

行がありませんが、datareader の行にアクセスしようとしています。つまり、dr が while ループに入らない場合、datareader に行はありませんが、「//何か問題がありますか?」というコメントがあるフィールドにまだアクセスしています。

于 2011-01-07T18:05:37.173 に答える