Как создать окно поиска?

#c# #.net #database #search #ms-access-2010

#c# #.net #База данных #Поиск #ms-access-2010

Вопрос:

Теперь я потратил несколько часов, пытаясь что-то придумать, гугля и читая форумы, но я не нашел свой ответ!

Мне нужно создать какое-то «бизнес-приложение» в качестве проекта в моей школе, где мне нужно вести обзор клиентов компании. Я использую Microsoft Visual C # 2010 Express и Access 2010 и пишу на C #, используя OleDb.

Мой вопрос:

Как мне создать окно поиска / форму для приложения для поиска информации в базе данных access (.accdb). Я хочу использовать текстовое поле, в которое я записываю что-либо из своей базы данных, например название компании, и нажимаю кнопку поиска. Теперь он должен записать всю информацию, связанную с названием компании, найденной в базе данных, в сетку данных.

Возможно, это слишком большой проект, поэтому, если у кого-нибудь есть менее сложная функция поиска, выполняющая что-то подобное, я также был бы признателен за это.

ВОТ КОД, ПОЛУЧЕНА ОШИБКА В .Fill(dataset, «Food»);. Исключение InvalidOperationException не было обработано. Заполнить: SelectCommand.Соединение не было инициализировано. Просто тестирую базу данных simple access с одной таблицей с именем «Food», внутри которой есть FoodID, FoodName и Price.

 private void button1_Click(object sender, RoutedEventArgs e)
    {
        GetCustomers(textBox1.Text);
    }
        // Load Data from the DataSet into the DataGridView
        private void GetCustomers(string searchTerm)
        {
            DataSet dataset = new DataSet();
            using (OleDbConnection connection = 
            new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:UsersNiclasDesktopSkoleProgrammeringDatabaseFood.accdb;Persist Security Info=False;"))
            {
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                adapter.SelectCommand = new OleDbCommand(
                "select * from Food where FoodID like ('"   searchTerm   "', connection");
                adapter.Fill(dataset, "Food");
            }

        // Get the table from the data set and bind the data to the grid
        this.dataGrid1 = new System.Windows.Controls.DataGrid();

        dataGrid1.DataContext = dataset.Tables[0];

        }
     }
  

Комментарии:

1. В чем конкретно ваша проблема? Как создать окно поиска? Поместите текстовые поля в форму. Затем, под кнопкой поиска, используйте SQL-запросы через используемый вами драйвер OleDB, чтобы выбрать данные с предложением WHERE в качестве вашего критерия текстовых полей.

2. Здравствуйте.. Это именно моя проблема, но я новичок, поэтому был бы признателен за некоторую помощь с кодированием 🙂 Спасибо.

Ответ №1:

Можете ли вы опубликовать имеющийся у вас код, который не работает?

По сути, при событии нажатия кнопки поиска вы бы вызвали функцию для заполнения DataGridView, например:

 GetCustomers(textBox1.Text);


// Load Data from the DataSet into the DataGridView
private void GetCustomers(string searchTerm)
{
DataSet dataset = new DataSet();
using (OleDbConnection connection = 
    new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:myFoldermyAccess2007file.accdb;Persist Security Info=False;"))
  {
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.SelectCommand = new OleDbCommand(
        "select * from customer where name like %"   searchTerm   "%", connection);
    adapter.Fill(dataset, "Customers");
  }

    // Get the table from the data set and bind the data to the grid
    DataGridView.DataSource = dataset.Tables[0];
}
  

У меня нет Visual Studio на этом компьютере, поэтому могут быть синтаксические ошибки, но это должно помочь вам начать.

Комментарии:

1. Я бы не стал этого делать "...%" searchTerm "%" … это открыто для внедрения SQL в той или иной форме. Если это вообще возможно, используйте параметризованные запросы. Я понимаю, что это школьный проект, но стоит научить хорошей практике и избежать подобных проблем 🙂

2. @chrisJ — Я согласен, и я должен был дать профессиональный совет — использовать SQL Server, MySQL и т.д. Но в MS Access нет сохраненных процедур, так как бы вы выполняли параметризованные запросы? Я оставлю хаки для SQL-инъекций операционной системе для исследования…

3. Параметризованные запросы не обязательно должны быть sprocs. Динамические запросы также могут, используя параметры-заполнители в запросе. У Microsoft есть статья об этом в Access и ADO — я ожидаю, что она будет довольно похожей для ADO.NET … support.microsoft.com/kb/200190

4. Большое спасибо! Что-то подобное я искал. Сработает ли это, если я c / p и, конечно, отредактирую исходный код и откуда / where?

5. Запустил приложение с помощью следующего кода. Но когда я набираю «1» в своем текстовом поле (чтобы найти nr 1 foodid в моей базе данных access) Я получаю сообщение об ошибке: (Что-то с синтаксической ошибкой в «FoodID like %1%». * Обновленный пост с кодом.

Ответ №2:

Я делал нечто подобное, когда работал стажером. Способ, которым я обошел это, заключался в создании формы для каждого типа данных, по которым я искал, а затем запустил фильтр в BindingSource, прикрепленном к представлению таблицы данных. Еще одним замечательным штрихом, который я добавил, было то, что этот фильтр запускался при нажатии клавиши, поэтому он срабатывал автоматически при наборе текста.

У меня был метод, который был примерно таким (он был преобразован из VB):

 private void Search()
{
    string[] strSplitString = null;
    string strSearchString = "";
    strSplitString = Strings.Split(txtSearch.Text.Trim);

    // Check to see if there are any strings
    if (strSplitString.Count == 1) {
        // Construct the search string
        strSearchString = "FirstName Like '%"   strSplitString[0]   "%' Or MiddleName Like '%"   strSplitString[0]   "%' Or LastName Like '%"   strSplitString[0]   "%'";

    } else if (strSplitString.Count > 1) {
        // Construct the string
        strSearchString = "(FirstName Like '%"   strSplitString[0]   "%' Or MiddleName Like '%"   strSplitString[0]   "%' Or LastName Like '%"   strSplitString[0]   "%')";

        // For each word add it to the search string
        for (intWord = 1; intWord <= (strSplitString.Count - 1); intWord  ) {
            strSearchString  = " And (FirstName Like '%"   strSplitString[intWord]   "%' Or MiddleName Like '%"   strSplitString[intWord]   "%' Or LastName Like '%"   strSplitString[intWord]   "%')";
        }
    }

    // Filter the binding source
    BindingSource.Filter = strSearchString;
}
  

Возможно, есть способы получше, но этот проект также был направлен против довольно большой базы данных access и, казалось, работал довольно хорошо

Комментарии:

1. Я бы не стал этого делать "...%" strSplitString[0] "%" … это открыто для внедрения SQL в той или иной форме. Если это вообще возможно, используйте параметризованные запросы. Я понимаю, что это школьный проект, но стоит научить хорошей практике и избежать подобных проблем 🙂 [Я также думаю, что страдаю дежавю]

2. @chrisJ Очень верно. Но, насколько я помню, когда я создавал это приложение, это была довольно трудоемкая задача, пытающаяся смягчить SQL-инъекции в Access. Моим личным предпочтением было бы использовать не Access, а что-то вроде SQL Server Compact Edition и использовать EF сверху, чтобы предотвратить такого рода атаки

3. Вам не нужен EF … смотрите support.microsoft.com/kb/200190 о том, как выполнять запросы с помощью ADO; перевод этого на ADO.NET .

4. @chrisJ Я совсем забыл об этом. Вероятно, это более простой способ достижения желаемого эффекта. EF местами может быть довольно неуклюжим

5. Привет .. Работает ли это, если у меня есть текстовое поле и при нажатии кнопки я копирую / вставляю это?