Позвольте пользователю выбрать критерии поиска базы данных в C#

Верхняя часть этой программы содержит три столбца элементов управления. В левом столбце содержатся комбинированные поля, содержащие имена полей в таблице базы данных. Средний столбец содержит операторы, такие как =, & lt ;, & gt; =. В правой колонке находятся текстовые поля. Пользователь может использовать эти элементы управления, чтобы определить, как программа запрашивает базу данных. Например, если пользователь выбирает поле Title из первого поля со списком, оператор & gt; = из второго и вводит R в первом текстовом поле, программа ищет записи, в которых поле Title имеет значение & gt; = R.

При загрузке формы выполняется следующий код. Обработчик события Form1_Load вызывает метод PrepareForm, который получает форму, готовую к работе.

// Объект соединения.
private OleDbConnection Conn;

// Имена столбцов таблицы.
private List ColumnNames = 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>, чтобы пользователь мог видеть результат.

Источник: http://csharphelper.com/blog/2015/08/let-the-user-pick-database-search-criteria-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector