Заполните флажки через базу данных - PullRequest
0 голосов
/ 15 апреля 2010

Я должен заполнить флажки данными, поступающими из базы данных, но на моей странице флажки не отображаются. Пожалуйста, дайте мне знать правильный способ сделать это. В C # метод page_load, который я написал, выглядит так:

public partial class dbTest1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string Server = "al2222";
        string Username = "hshshshsh";
        string Password = "sjjssjs";
        string Database = "database1";

        string ConnectionString = "Data Source=" + Server + ";";
        ConnectionString += "User ID=" + Username + ";";
        ConnectionString += "Password=" + Password + ";";
        ConnectionString += "Initial Catalog=" + Database;
        string query = "Select * from Customer_Order where orderNumber = 17";

        using (SqlConnection conn = new SqlConnection(ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand(query, conn))
            {
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    if (!IsPostBack)
                    {
                        Interests.DataSource = dr;
                        Interests.DataTextField = "OptionName";
                        Interests.DataValueField = "OptionName";
                        Interests.DataBind();
                    }
                }
                conn.Close();
                conn.Dispose();
            }
        }
    }
}

И в .aspx у меня есть это:

<asp:CheckBoxList ID="Interests" runat="server"></asp:CheckBoxList>

Пожалуйста, скажите мне правильный способ сделать это.

1 Ответ

1 голос
/ 15 апреля 2010

Хотя на ваш вопрос уже дан ответ (с помощью комментариев в строке подключения), я подумал, что я должен сообщить о возможном способе переписать это. Я начал это как комментарий, но он стал немного длинным и громоздким. Обратите внимание, что это не дает прямого ответа на ваш вопрос, но это то, что нужно учитывать для чистоты кода и возможного (вероятно, очень умеренного) прироста производительности для обратных передач.

protected void Page_Load(object sender, EventArgs e)
{
    // If we're in postback, let's not poll the database.
    if (Page.IsPostback)
        return; // Change this if you do need some postback processing here.

    // I assume that in the real world you pull this info from web.config
    string Server = "al2222";
    string Username = "hshshshsh";
    string Password = "sjjssjs";
    string Database = "database1";

    string ConnectionString = "Data Source=" + Server + ";";
    ConnectionString += "User ID=" + Username + ";";
    ConnectionString += "Password=" + Password + ";";
    ConnectionString += "Initial Catalog=" + Database;
    string query = "Select * from Customer_Order where orderNumber = 17";

    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            // Going to assume that you're only getting 1 record 
            // due to apparent key (orderNumber = 17) in query?
            // You can also consider "if (dr.Read())", but fundamentally
            // they will do the same thing.
            while (dr.Read())
            {
                Interests.DataSource = dr;
                Interests.DataTextField = "OptionName";
                Interests.DataValueField = "OptionName";
                Interests.DataBind();
            }
            // I've excised the calls to .Close() and .Dispose(),
            // as the using block covers them for you.
        }
    }
}

Зачем нам идти по этому пути?

  1. В исходном коде вы опрашивали базу данных (и, возможно, выполняли зацикливание, если мое предположение о том, что запрос состоит из одной записи, было неверным) при каждой загрузке страницы, независимо от того, были ли вы в обратной передаче. Вы не проверяли обратную передачу, пока не оказались внутри петли, где ущерб в основном уже был нанесен. В коде, который я перечислил, вы вообще закоротите из Page_Load(), если находитесь в обратной передаче. Конечно, вы можете изменить это значение на if / else и заключить в скобки группы, если вам также потребуется некоторая обработка событий загрузки для обратных передач. Это также упростило ваш зацикленный код.
  2. Ваши блоки using покрывают удаление / закрытие соединения для вас. Таким образом, вам не нужен этот дополнительный код.
  3. Как сказал OrbMan в комментариях, мы надеемся, что в вашем реальном коде вы извлекаете всю информацию о строке подключения из файла web.config вместо ее жесткого кодирования, правильно?

Заключительное заключительное несвязанное примечание. Это большой код доступа к данным, который более новые версии .NET Framework значительно упрощают с помощью таких инструментов, как Entity Framework и LINQ-to-SQL. Есть также сторонние инструменты уровня доступа к данным (такие как SubSonic и ActiveRecord), которые упростят это. Использование таких инструментов значительно сократит объем кода, который вы здесь пишете - и я предполагаю, что вы используете довольно много похожего кода и во всем приложении, так что эти инструменты предоставят вам разработчика довольно повышение производительности. (И намного проще в дороге.)

Просто пища для размышлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...