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您可以在单个查询中获取所需的所有数据。在这里,您有一个示例代码,您可以遵循

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);
            }
        }
    }
}

这里有一篇 MSDN 文章,可以帮助您了解如何使用 SqlDataReader

于 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 回答