1

私は ASP.NET の初心者で、自分で選んだ課題として、簡単なブログを作成することになりました。ほぼ完成ですが、問題が発生しました。コードからわかるように、まずクエリを使用して、SQL サーバー データベースからブログ エントリの量を返します。次に、for ループがすべての行からタイトル、日付、およびテキスト コンテンツを読み取り、それらをロードする html div を作成します。 ExecuteScalar() は最初の行のみを読み取るため、反復ごとに同じ値が返され、すべてのブログ エントリが同じになります。

読者が各反復で先に進む方法が必要です。SQLbulkcopy を別のテーブルに作成して、for ループで一番上の行を削除できるようにすることを検討しましたが、これを Page_Load ごとに行うと、ページの速度がかなり低下するようです。

string SQLreadTitle = "Select BLOG.BlogTitle from BLOG order by BlogID DESC";
string SQLreadDate = "Select BLOG.BlogDate from BLOG order by BlogID DESC";
string SQLreadText = "Select BLOG.BlogText from BLOG order by BlogID DESC";
string SQLcountIDs = "Select count(BlogID) from BLOG";

protected void Page_Load(object sender, EventArgs e)
{

    int i;
    SqlConnection con = new SqlConnection(cnString);
    con.Open();

    SqlCommand countIDs = new SqlCommand(SQLcountIDs, con);
    int count = Convert.ToInt32(countIDs.ExecuteScalar());



    for (i = 0; i < count; i++)
    {
        SqlCommand readTitle = new SqlCommand(SQLreadTitle, con);
        string titleString = readTitle.ExecuteScalar().ToString();
        SqlCommand readDate = new SqlCommand(SQLreadDate, con);
        string dateString = readDate.ExecuteScalar().ToString();
        SqlCommand readText = new SqlCommand(SQLreadText, con);
        string textString = readText.ExecuteScalar().ToString();



        System.Web.UI.HtmlControls.HtmlGenericControl dynDiv =
        new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");
        dynDiv.ID = "BlogPost";
        dynDiv.InnerHtml = "<div id=\"BlogTitle\">" + 
            titleString + "</div><br /><div id=\"BlogDate\">"
            + dateString + "</div><br /><br /><div id=\"BlogText\">" 
            + textString + "</div>";
        Label1.Controls.Add(dynDiv);


    }
    con.Close();
}

前もって感謝します!

4

3 に答える 3

5

あなたは自分の人生をあまりにも困難にしています。単一の select ステートメントを用意してから、返された各行を読み取る必要があります。

    string SQL = "Select BLOG.BlogTitle, BLOG.BlogDate, BLOG.BlogText from BLOG order by BlogID DESC";
    // Positions of the columns you are reading
    const int TITLE_ORDINAL = 0;
    const int DATE_ORDINAL = 1;
    const int TEXT_ORDINAL = 2;

    protected void Page_Load(object sender, EventArgs e)
    {
        using (var con = new SqlConnection(cnString))
        {
            con.Open();
            try
            {
                using (var oCommand = new SqlCommand(SQL, con))
                {
                    using (var oReader = oCommand.ExecuteReader())
                    {
                        while (oReader.Read())
                        {
                            var dynDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");
                            dynDiv.ID = "BlogPost";
                            dynDiv.InnerHtml = "<div id=\"BlogTitle\">" +
                                oReader.GetString(TITLE_ORDINAL) + "</div><br /><div id=\"BlogDate\">"
                                + oReader.GetString(DATE_ORDINAL) + "</div><br /><br /><div id=\"BlogText\">"
                                + oReader.GetString(TEXT_ORDINAL) + "</div>";
                            Label1.Controls.Add(dynDiv);
                        }
                    }
                }
            } finally {
                con.Close();
            }
        }
    }
于 2012-03-25T23:43:55.427 に答える
1

いくつかの間違った概念があるので、ADO.NETについてもう少し読んだと思います。 SqlCommand.ExecuteScalarは、データセットを取得するためではなく、データベースから単一の値を取得するために使用されます。

レコードセットを反復処理するためにアイテム数を取得する必要はありません。SqlCommand.ExecuteReaderを使用すると、1回のクエリで必要なすべてのデータを取得できます。ここにあなたが従うことができるサンプルコードがあります

string sqlQuery = "Select * from BLOG order by BlogID DESC";
using (SqlConnection con = new SqlConnection(cnString))
{
    con.Open();
    using (SqlCommand cmd = new SqlCommand(sqlQuery, con))
    {
        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                System.Web.UI.HtmlControls.HtmlGenericControl dynDiv =
                new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");
                dynDiv.ID = "BlogPost";
                dynDiv.InnerHtml = "<div id=\"BlogTitle\">" +
                    dr["BlogTitle"] + "</div><br /><div id=\"BlogDate\">"
                    + dr["BlogDate"].ToString() + "</div><br /><br /><div id=\"BlogText\">"
                    + dr["BlogText"] + "</div>";
                Label1.Controls.Add(dynDiv);
            }
        }
    }
}

ここに、SqlDataReaderの使用方法を理解するのに役立つMSDNの記事があります。

于 2012-03-25T23:43:16.430 に答える
0

ExecuteScalarはここで必要なものではなく、カウントも必要ありません。データアダプタについてはこちらをご覧ください。Fillメソッドを呼び出した後、データテーブルにはデータベースのすべてのコンテンツが含まれ、反復処理できます。ここでデータテーブルクラスについて読むことができます。

簡単な反復例は次のとおりです。

DataTable tbl = new DataTable();

foreach (DataRow row in tbl.Rows)
{
    foreach (DataColumn col in tbl.Columns)
    {
        object cellData = row[col];
    }
}
于 2012-03-25T23:43:20.220 に答える