Позвольте пользователю выбрать критерии поиска базы данных в C#
Верхняя часть этой программы содержит три столбца элементов управления. В левом столбце содержатся комбинированные поля, содержащие имена полей в таблице базы данных. Средний столбец содержит операторы, такие как =, & lt ;, & gt; =. В правой колонке находятся текстовые поля. Пользователь может использовать эти элементы управления, чтобы определить, как программа запрашивает базу данных. Например, если пользователь выбирает поле Title из первого поля со списком, оператор & gt; = из второго и вводит R в первом текстовом поле, программа ищет записи, в которых поле Title имеет значение & gt; = R. р>
При загрузке формы выполняется следующий код. Обработчик события Form1_Load вызывает метод PrepareForm, который получает форму, готовую к работе.
// Объект соединения. private OleDbConnection Conn; // Имена столбцов таблицы. private ListColumnNames = new List (); private string TableName = ""; // Элемент управления запросами. private ComboBox[] CboField, CboOperator; private TextBox[] TxtValue; private List DataTypes = new List (); // Создаем список полей таблицы. private void Form1_Load(object sender, EventArgs e) { // Создаем имя файла базы данных. // Предполагается, что он находится в каталоге исполняемого файла. string db_name = Application.StartupPath + "\\Books.accdb"; // Подготовьте форму для использования. PrepareForm(db_name, "BookInfo"); } // Создаем список имен полей таблицы и // подготовьте первый ComboBox. private void PrepareForm(string db_name, string table_name) { TableName = table_name; // Создаем объект соединения. Conn = new OleDbConnection( "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + db_name + ";" + "Mode=Share Deny None"); // Получить поля в таблице BookInfo. // Создаем объект команды для представления команды. OleDbCommand cmd = new OleDbCommand(); cmd.Connection = Conn; cmd.CommandText = "SELECT TOP 1 * FROM " + table_name; // Откройте соединение и выполните команду. try { // Откройте соединение. Conn.Open(); // Выполните запрос. Читатель дает доступ к результатам. OleDbDataReader reader = cmd.ExecuteReader(); // Получить информацию о поле. DataTable schema = reader.GetSchemaTable(); foreach (DataRow schema_row in schema.Rows) { ColumnNames.Add(schema_row.Field ("ColumnName")); DataTypes.Add(schema_row.Field ("DataType")); // Console.WriteLine ( // schema_row.Field & lt; type & gt; («DataType»). ToString ()); } // Инициализировать имя поля ComboBoxes. CboField = new ComboBox[] { cboField0, cboField1, cboField2, cboField3 }; CboOperator = new ComboBox[] { cboOperator0, cboOperator1, cboOperator2, cboOperator3 }; TxtValue = new TextBox[] { txtValue0, txtValue1, txtValue2, txtValue3 }; for (int i = 0; i < CboField.Length; i++) { CboField[i].Items.Add(""); // Разрешить пробел. foreach (string field_name in ColumnNames) { CboField[i].Items.Add(field_name); } CboField[i].SelectedIndex = 0; CboOperator[i].SelectedIndex = 0; } } catch (Exception ex) { MessageBox.Show("Error reading " + table_name + " column names.\n" + ex.Message); } finally { Conn.Close(); } }
Метод PrepareForm создает объект подключения к базе данных. Затем он выбирает запись из таблицы базы данных-указателя, чтобы получить информацию об этой таблице. Он сохраняет имена столбцов таблицы в списке ColumnNames и сохраняет типы данных столбцов в списке DataTypes. Затем он использует список ColumnNames для инициализации левого столбца комбинированных полей, отображающих имена столбцов.
Когда пользователь делает выбор и клики Query, выполняется следующий код.
// Создаем и выполняем соответствующий запрос. private void btnQuery_Click(object sender, EventArgs e) { string where_clause = ""; for (int i = 0; i < CboField.Length; i++) { // См., Если поле и оператор не пустые. if ((CboField[i].SelectedIndex <= 0) || (CboOperator[i].SelectedIndex <= 0)) { // Не используйте эту строку. Очистите его, чтобы предотвратить путаницу. CboField[i].SelectedIndex = 0; CboOperator[i].SelectedIndex = 0; TxtValue[i].Clear(); } else { // Посмотрим, какой разделитель нам нужен для этого типа поля. string delimiter = ""; string value = TxtValue[i].Text; int column_num = CboField[i].SelectedIndex - 1; if (DataTypes[column_num] == typeof(System.String)) { delimiter = "'"; value = value.Replace("'", "''"); } else if (DataTypes[column_num] == typeof(System.DateTime)) { // Использовать # для доступа, для SQL Server. delimiter = "#"; } // Добавьте ограничение в предложение WHERE. where_clause += " AND " + CboField[i].SelectedItem.ToString() + " " + CboOperator[i].SelectedItem.ToString() + " " + delimiter + value + delimiter; } // если выбрано поле и оператор. } // for (int i = 0; i & lt; CboField.Length; i ++) // Если where_clause не является пробелом, удалите начальное «AND». if (where_clause.Length > 0) where_clause = where_clause.Substring(5); // Выполните запрос. string query = "SELECT * FROM " + TableName; if (where_clause.Length > 0) query += " WHERE " + where_clause; // Console.WriteLine («Запрос:« + запрос »); // Создаем DataAdapter для загрузки данных. OleDbDataAdapter data_adapter = new OleDbDataAdapter(query, Conn); // Создаем DataTable. DataTable data_table = new DataTable(); try { data_adapter.Fill(data_table); } catch (Exception ex) { MessageBox.Show("Error executing query " + query + "\n" + ex.Message); } dgvBookInfo.DataSource = data_table; }
Этот код проходит через комбинированные поля. Если пользователь выбрал имя поля и соответствующий оператор, код добавляет условие к выражению WHERE, которое он строит. Если пользователь оставляет поле или оператор пустым, программа заполняет другие соответствующие элементы управления, поэтому не похоже, что они могут вносить вклад в окончательное предложение WHERE.
Когда он создает каждую часть предложения WHERE, код использует разделители для значений строк и дат. Он использует одиночную кавычку для строк, и использует даты # для даты. (Для баз данных доступа требуется # разделителей для дат. Для баз данных SQL Server требуется «разделители для дат».
После создания предложения WHERE программа создает окончательный запрос и выполняет его. Он использует адаптер данных для загрузки результатов в DataTable и устанавливает свойство DataSource элемента управления формы DataGridView, равное DataTable tt>, чтобы пользователь мог видеть результат.