#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. Привет .. Работает ли это, если у меня есть текстовое поле и при нажатии кнопки я копирую / вставляю это?