Рейтинг:
4
Richard Deeming
Попробуйте что-нибудь вроде этого:
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Status()
End Sub
Public Sub Status()
' TODO: Move this to the application's configuration file:
Const sCon As String = "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\db.accdb"
Using con As OleDbConnection = New OleDbConnection(sCon)
Using cmd As OleDbCommand = New OleDbCommand("", con)
Dim str As String = "SELECT * FROM dbtable WHERE Status = @S"
cmd.Parameters.Add("@S", OleDbType.VarChar).Value = TextBox1.Text
If ComboBox1.Text = "Country" Then
str = str & " AND Country = @Country"
cmd.Parameters.Add("@Country", OleDbType.VarChar).Value = ComboBox2.Text
End If
cmd.CommandText = str
Dim dt As New DataTable
Dim adp As New OleDbDataAdapter(cmd)
adp.Fill(dt)
DataGridView1.DataSource = dt
End Using
End Using
End Sub
Member 13890537
Спасибо Вам, мистер Ричард, что считаете, что это работает. Прежде чем я не знаю, как это сделать, примените этот str = str & "и Country = @Country", пока вы не покажете мне, как это сделать, поэтому я попытаюсь использовать этот код.
Dim dv как новый DataView(dt)
dv.RowFilter = "Страна ="Япония" и статус="нанят""
DataGridView1.Источник данных = ДВ
и это работает
Но я хочу, чтобы combobox1 и combobox2 были идентификаторами, а textbox1 и textbox2-данными имени столбца.
но
Я не уверен, как поместить это в мой 2 combobox = ColumnName и в мой 2 textbox = Data столбца. Должен ли я использовать условие IF, чтобы заставить его работать?
Поэтому я стараюсь и ошибаюсь
этот код работает. Я знаю, что использовать строку - это плохо.
dv.RowFilter = "страна как '%" + TextBox1.Text + "%' и статус как '%" + TextBox2.Text + "%'"
Но это, не знаю, как сделать этот код. Я пытаюсь найти короткий путь, если он есть?
ДВ.RowFilter = Элемент Combobox1.Текст &ампер; " = " &амп; текстовое поле textbox1.Текст & "и" &АМП; ComboBox2.Текст &ампер; " = " &амп; поле textbox2.Текст это сказать, система.Данных.SyntaxErrorException: 'синтаксическая ошибка: отсутствует операнд после оператора StaffAndCountry'.'
Я планирую потратить > 8 часов на попытки и ошибки, чтобы понять эту проблему, пока не прочитаю ваш код. Еще раз большое вам спасибо, Мистер, и желаю вам хорошего и здорового дня. Но все же я пытаюсь понять, возможно ли это?
У меня есть небольшой вопрос о методе, который вы используете. В чем разница между этим и использованием .RowFilter ?
Примечание: это нормально, если вы не хотите отвечать на этот вопрос, потому что когда-нибудь я это выясню. ^_^ Еще раз спасибо, Мистер
Richard Deeming
ДВ.RowFilter = Элемент Combobox1.Текст &ампер; " = " &амп; текстовое поле textbox1.Текст & "и" &АМП; ComboBox2.Текст &ампер; " = " &амп; поле textbox2.Текст
Вы пропускаете пробелы вокруг And
оператор и кавычки вокруг значений. Попробуй:
dv.RowFilter = ComboBox1.Text & " = '" & TextBox1.Text & "' And " & ComboBox2.Text & " = '" & TextBox2.Text & "'"
Вы правы, что использование конкатенации строк в запросе - это плохо. Но в этом случае фильтр вычисляется локально; недопустимые входные данные не могут выдать мошеннический запрос к вашей базе данных. И
RowFilter
у него нет понятия параметров, поэтому у вас нет альтернативы.
Member 13890537
Это означает, что безопасно использовать конкатенацию строк с помощью RowFilter.
Еще раз спасибо, что это работает! Я помещу это в свою папку скриншотов ошибок для записи.
С точки зрения Мистера Диминга, что лучше использовать или хорошо практиковать? RowFilter или решение, которое вы дали с помощью параметров?
Я счастлив, что сегодня снова учусь.
Как вы научились этому или приобрели это на собственном опыте?
Желаю вам отличного и здорового дня мистер
Richard Deeming
Если вы фильтруете данные, которые уже были загружены, и вас не беспокоят записи, которые были добавлены в базу данных с момента загрузки данных, то RowFilter
наверное, так будет лучше.
Member 13890537
Я обнаружил проблему этого RowFilter, когда я пытаюсь ввести эти данные в свою базу данных " Япония и должность, которую я не обслуживаю. Затем попробуйте найти это с помощью rowfilter, он говорит, что есть ошибка, говорит отсутствующий операнд после "Japan". Нет никакой ошибки, если я ищу слово без единой строки.
Кстати можно ли сделать этот короткий ДВ код.RowFilter = Элемент Combobox1.Текст + " как '%" + текстовое поле textbox1.Текст + "%' И " + ComboBox2.Текст + " как '%" + поле textbox2.Текст + "%' и DateandTime1 &ГТ;='" + DateTimePicker1.Значение + "' и DateandTime1 &ЛТ;='" + DateTimePicker2.Значение + "'" с помощью параметров?
Еще раз спасибо Мистер Диминг
Желаю вам отличного и здорового дня мистер
Richard Deeming
К сожалению, с тех пор как RowFilter
не поддерживает параметры, вам нужно будет "экранировать" одинарные кавычки, удваивая их.
Даты требуют особого форматирования - их нужно завернуть в бумагу. #
символы, а также использовать американский формат "ММ/ДД/гггг".
Попробуйте что-нибудь вроде этого:
dv.RowFilter = string.Format("{0} Like '%{1}%' And {2} Like '%{3}%' And DateandTime1 >= #{4:MM/dd/yyyy}# And DateandTime1 <= #{5:MM/dd/yyyy}#",
ComboBox1.Text, TextBox1.Text.Replace("'", "''"),
ComboBox2.Text, TextBox2.Text.Replace("'", "''"),
DateTimePicker1.Value, DateTimePicker2.Value);
Документация по синтаксису фильтра доступна в разделе
DataColumn.Expression
замечания:
https://docs.microsoft.com/en-gb/dotnet/api/system.data.datacolumn.expression?view=netframework-4.7.2#expression-syntax[
^]
Member 13890537
Он работает так же, как и параметр.
Я читал это письмо
http://www.csharp-examples.net/dataview-rowfilter/
Статья, но еще не прочитанная. Я еще не знаю, как закодировать это так, как вы это кодируете. Кстати, в чем смысл(цель) этого слова?"{0}, '%{1}%', {2}, '%{3}%' ,4: ,5: в этой строке кода dv.RowFilter = string.Формат ("{0} Как '%{1}%' и {2} как '%{3}%' и DateandTime1 >= #{4:MM/dd/yyyy}# и DateandTime1 <= #{5:MM/dd/yyyy}#",? Так что я могу понять больше
Еще Раз Спасибо Мистер Диминг
Я действительно ценю вашу помощь
Желаю вам отличного и здорового дня мистер
Member 13890537
Добрый День Мистер Диминг
Спасибо за ссылки и я уже начинаю ее читать
Если у меня есть еще один вопрос, Могу я задать его вам снова?
Желаю вам здорового и отличного дня мистер
Richard Deeming
Лучше всего опубликовать его как новый вопрос. Таким образом, другие люди тоже могут помочь. :)
Member 13890537
Хорошо ^_^ большое спасибо, что ответили на все мои вопросы. Ваш лучший Мистер Диминг
Желаю вам отличного и здорового дня мистер