Позвольте пользователю выбрать критерии поиска базы данных в 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>, чтобы пользователь мог видеть результат.
