Хотя на ваш вопрос уже дан ответ (с помощью комментариев в строке подключения), я подумал, что я должен сообщить о возможном способе переписать это. Я начал это как комментарий, но он стал немного длинным и громоздким. Обратите внимание, что это не дает прямого ответа на ваш вопрос, но это то, что нужно учитывать для чистоты кода и возможного (вероятно, очень умеренного) прироста производительности для обратных передач.
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.
}
}
}
Зачем нам идти по этому пути?
- В исходном коде вы опрашивали базу данных (и, возможно, выполняли зацикливание, если мое предположение о том, что запрос состоит из одной записи, было неверным) при каждой загрузке страницы, независимо от того, были ли вы в обратной передаче. Вы не проверяли обратную передачу, пока не оказались внутри петли, где ущерб в основном уже был нанесен. В коде, который я перечислил, вы вообще закоротите из
Page_Load()
, если находитесь в обратной передаче. Конечно, вы можете изменить это значение на if
/ else
и заключить в скобки группы, если вам также потребуется некоторая обработка событий загрузки для обратных передач. Это также упростило ваш зацикленный код.
- Ваши блоки
using
покрывают удаление / закрытие соединения для вас. Таким образом, вам не нужен этот дополнительный код.
- Как сказал OrbMan в комментариях, мы надеемся, что в вашем реальном коде вы извлекаете всю информацию о строке подключения из файла web.config вместо ее жесткого кодирования, правильно?
Заключительное заключительное несвязанное примечание. Это большой код доступа к данным, который более новые версии .NET Framework значительно упрощают с помощью таких инструментов, как Entity Framework и LINQ-to-SQL. Есть также сторонние инструменты уровня доступа к данным (такие как SubSonic и ActiveRecord), которые упростят это. Использование таких инструментов значительно сократит объем кода, который вы здесь пишете - и я предполагаю, что вы используете довольно много похожего кода и во всем приложении, так что эти инструменты предоставят вам разработчика довольно повышение производительности. (И намного проще в дороге.)
Просто пища для размышлений.