Если в таблице содержится много данных, то заполнение списка данными, как это мы только что проделали, даже из нескольких столбцов требует больших затрат вычислительных ресурсов. Ниже мы применим параметризованный (с параметрами) оператор SQL для ограничения количества элементов, отображаемых в списке. Это позволит уменьшить потребность в ресурсах и тем самым повысит производительность выполнения формы.
Предположим, что в базе данных содержатся данные о сотнях тысяч заказчиков и поэтому не следует загружать в элемент управления списком сразу всю таблицу заказчиков. Рассмотрим способы ограничения данных, отображаемых в списке.
Прежде всего необходимо сделать копию предыдущей формы. Затем в форму нужно ввести элементы управления Label и TextBox, из которых в оператор Select, содержащийся в элементе управления OleDbDataAdapter, будет поступать информация, позволяющая ограничить объем данных, отображаемых в списке. В форму нужно ввести кнопку Button, при щелчке на которой будет вызываться метод Fill() элемента управления OleDbDataAdapter после введения новых данных в текстовое поле.
Здесь мы чуть облегчим себе работу, чтобы заново не создавать и не настраивать элементы соединения с базой. Мы просто скопируем код предыдущей формы вместе с объектами и их настройками в новую форму. После этого достаточно будет дополнить новую форму необходимыми элементами и настроить только их.
К проекту добавится файл с дежурным именем Copy of Form1.cs
public class Form2 : System.Windows.Forms.Form ....................... public Form2() ....................... static void Main() { Application.Run(new Form2()); }
Убедитесь, что все помещенные ранее на первую форму элементы управления сохранились и на второй форме, в том числе и элемент ListBox, растянутый по всей клиентской области формы. Внутри нового класса Form2 за ними можно оставить прежние имена, поскольку в рамках приложения префикс Form2 делает их уникальными.
Теперь можно приступать к выполнению дальнейших этапов плана. Начнем с перестройки параметров адаптера данных.
SELECT CustomerID, CompanyName FROM Customers WHERE (CompanyName LIKE ? + '%')
В применяемой здесь инструкции WHERE выполняется сравнение значений поля CompanyName с заданным параметром, значение которого будет передано из текстового поля элемента TextBox, еще не помещенного нами на форму. Знак процента представляет собой подстановочный символ, который указывает серверу, что в значении поля должен быть выполнен поиск подстроки.
В приведенном выражении отражается существенная разница в использовании элементов управления OleDbDataAdapter и SqlDataAdapter. Элемент управления OleDbDataAdapter предусматривает использование операции ? для указания места вставки передаваемого извне параметра в SQL-оператор SELECT, а для элемента управления SqlDataAdapter требуется именованный параметр, такой как @parCustLimit. Фактическое имя параметра зависит от конкретной программы. Приведем оба варианта одной и той же SQL-команды
OleDbDataAdapter | SELECT CustomerID, CompanyName FROM Customers WHERE (CompanyName LIKE ? + '%') |
SqlDataAdapter | SELECT CustomerID, CompanyName FROM Customers WHERE (CompanyName LIKE @parCustLimit + '%') |
Компонент | Свойство | Значение |
---|---|---|
Label | Text | Клиент: |
TextAlign | MiddleRight | |
Size/Height | 20 | |
TextBox | Name | txtCustLimit |
Text | A (латинское!) | |
Button | Name | btnLoadList |
Text | Заполнить |
private void btnLoadList_Click(object sender, System.EventArgs e) { oleDbDataAdapter1.SelectCommand.Parameters[0].Value = txtCustLimit.Text; dataSet11.Clear(); oleDbDataAdapter1.Fill(dataSet11); }Листинг 5.2. Код обработчика кнопки
public Form2() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // oleDbDataAdapter1.Fill(dataSet11); }Листинг 5.3. Код, который нужно удалить из конструктора формы
Если первую форму не отключить от проекта, то в приложении будут существовать две точки входа, которые определяются функциями Main(), что не допустимо.