2010-04-15 2 views
0

Мне нужно заполнить флажки данными, поступающими из базы данных, но на моей странице не отображаются флажки. Пожалуйста, дайте мне знать правильный способ сделать это. В 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> 

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

+0

Убедитесь, что ваш SQL-запрос выполнен, и на этой странице нет других ошибок. Вы пытались запустить отладчик? Потому что ваш код выглядит просто отлично. –

+0

В вашем примере вам нужно проверить обратный вызов, прежде чем открывать соединение db и запрашивать данные. –

+1

В несвязанной заметке вместо того, чтобы компилировать строку подключения в вашем коде, поместите ее в 'web.config'. – RedFilter

ответ

1

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

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. Как указано в комментариях, мы надеемся, что в вашем фактическом коде вы извлекаете всю информацию строки соединения из вашего файла web.config вместо жесткого кодирования, правильно?

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

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

Смежные вопросы