Member 13890537 Ответов: 3

Я пытаюсь создать поиск по диапазону дат в VB.NET и госпожа Аксес


Я совершенно новичок в программировании и люблю изучать новые вещи, особенно код. Не могли бы вы помочь мне решить эту проблему?
Я пытаюсь создать поиск по диапазону дат, но когда я пытаюсь выполнить поиск с 1/6/2016 по 2/2/2017 в моем Datagridview появилась дата 2018 года.
В моей БД мой тип данных DATE_OF_PAYMENT-это Дата/Время и формат (короткая дата) 11/12/2015.
Не могли бы вы показать мне правильный код для этого? Я потратил 8 часов на поиски решения, но все равно потерпел неудачу.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    con.Open()
    Dim ds As New DataSet
    Dim dt As New DataTable
    ds.Tables.Add(dt)
    Dim da As New OleDbDataAdapter
    da = New OleDbDataAdapter("select * from VOUCHER", con)

    da = New OleDbDataAdapter(" Select * from VOUCHER WHERE DATE_OF_PAYMENT between '" + DateTimePicker1.Value + "' and '" + DateTimePicker2.Value + "'", con)
    'da = New OleDbDataAdapter(" Select * from VOUCHER WHERE DATE_OF_PAYMENT >='" & TextBox2.Text & "' AND DATE_OF_PAYMENT <='" & TextBox3.Text & "'", con)



    da.Fill(dt)
    DataGridView1.DataSource = dt.DefaultView
        con.Close()

End Sub


Что я уже пробовал:

Я попробовал этот код, но никакого отображения в datagridview
<pre lang="vb">
Dim str As String
str = "SELECT * FROM VOUCHER WHERE DATE_OF_PAYMENT  = " + DateTimePicker1.Value + " and " + DateTimePicker2.Value
        da = New OleDbDataAdapter(str, con)

3 Ответов

Рейтинг:
21

Maciej Los

Пожалуйста, ознакомьтесь с комментариями и ответами на эту тему: Как найти между двумя датами, такими как 01 мая 2018 года и 25 мая 2018 года?[^]
Решение № 3 предоставляет информацию о правильном способе фильтрации данных через OleDb.


Member 13890537

Спасибо, что научили меня правильно использовать параметр при поиске данных.
1 последний вопрос?
можно ли мне оставить свои значения как (?) в этом коде?
Это для моей кнопки ввода

Тусклый str как струна
str = "вставить в HISTORYLOG([VOUCHER_NUMBER],[DATE_OF_PAYMENT],[PAID_TO],[AMOUNT],[ITO],[IFROM],[SALES_OF_INVOICE_NUMBER],[ACTIVITY],[PAYEE_COMPANY],[TYPE_OF_EXPENSE],
[ACCOUNT_CODE],[CHECKE СЛУЖБЫ],[БАНК],[ДАТА1],[TYPE_OF_SUPPORTING_DOCUMENT],[ПОПАДАЮТ],[SUBJECT_TO_W_TAX],
[W_TAX_RATE],[INPUT_VAT],[W_TAX],[BALANCE],[TOTAL_PHP],[DATEANDTIME],[EXPORTER_NAME]) значения (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"

Дим объект oledbcommand cmd в качестве стр = новый объект oledbcommand (, кон)
cmd.параметры.Add(New OleDbParameter("VOUCHER_NUMBER", CType(VOUCHER_NUMBERTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("DATE_OF_PAYMENT", CType(DATE_OF_PAYMENTTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("PAID_TO", CType(PAID_TOTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("AMOUNT", CType(AMOUNTTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("ITO", CType(TOTextBox.Text, String)))
cmd.параметры.Добавить(новый класса oledbparameter("я", ctype для(FROMTextBox.Текст, Строку)))
cmd.параметры.Add(New OleDbParameter("SALES_OF_INVOICE_NUMBER", CType(SALES_OF_INVOICE_NUMBERTextBox.Text, String)))
cmd.параметры.Добавить(новый класса oledbparameter, ("активности", ctype для(ACTIVITYTextBox.Текст, Строку)))
cmd.параметры.Add(New OleDbParameter("PAYEE_COMPANY", CType(PAYEE_COMPANYTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("TYPE_OF_EXPENSE", CType(TYPE_OF_EXPENSETextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("ACCOUNT_CODE", CType(ACCOUNT_CODETextBox.Text, String)))
cmd.параметры.Добавить(новый класса oledbparameter("checke службы", ctype для(CHECKTextBox.Текст, Строку)))
cmd.параметры.Add(New OleDbParameter("BANK", CType(BANKTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("DATE1", CType(DATE1TextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("TYPE_OF_SUPPORTING_DOCUMENT", CType(TYPE_OF_SUPPORTING_DOCUMENTTextBox.Text, String)))
cmd.параметры.Добавить(новый класса oledbparameter("облагаемая НДС", ctype для(VATABLETextBox.Текст, Строку)))
cmd.параметры.Add(New OleDbParameter("SUBJECT_TO_W_TAX", CType(SUBJECT_TO_W_TAXTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("W_TAX_RATE", CType(W_TAX_RATETextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("INPUT_VAT", CType(INPUT_VATTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("W_TAX", CType(W_TAXTextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("BALANCE", CType(BALANCETextBox.Text, String)))
cmd.параметры.Add(New OleDbParameter("TOTAL_PHP", CType(TOTAL_PHPTextBox.Text, String)))
-командир.Параметры.Add(New OleDbParameter("INPUTER_NAME", CType(InputerNametxt.Text, String)))
cmd.параметры.Add(New OleDbParameter("DATEANDTIME", CType(DATEANDTIMEtxt.Text, String)))
cmd.параметры.Add(New OleDbParameter("EXPORTER_NAME", CType(ExporterNametxt.Text, String)))

УМК.Метод executenonquery()
УМК.Располагать()
против.Закрывать()

Maciej Los

Да, это правильное заявление. Попробуй это выяснить. ;)

Member 13890537

Я использовал его. Просто беспокоюсь, можно ли оставить ценности (?), потому что я видел какую-то статью, в которой они называли ценности.
Раньше я не знал, как использовать этот код параметра для выбора(поиска), поэтому я использую конкатенацию строк для построения SQL-команды до тех пор, пока вы
научить меня. Большое вам спасибо за то, что вы так добры ^_^

Maciej Los

Всегда пожалуйста.
Овации,
Мацей

Member 13890537

Здоровый День, Господин Мацей. Вот я снова стесняюсь задавать вопросы, но я должен это сделать, потому что хочу узнать больше.
Не могли бы вы помочь мне правильно закрыть Excel код который я использую находится в ссылке https://www.codeproject.com/Questions/1250678/How-do-I-properly-close-excel-in-VB-NET

Рейтинг:
2

Patrice T

Тип данных Date существует по некоторым причинам, то есть потому, что вы не можете сравнить дату в человеческой форме. Когда вы сравниваете 2 даты, вы знаете, что сначала сравниваете год, затем месяц и день, потому что у вас есть понимание даты.
Компьютер не имеет такого понимания, когда дата является строкой, вы говорите SQL server, что дата является датой, а не простой строкой.

da = New OleDbDataAdapter(" Select * from VOUCHER WHERE DATE_OF_PAYMENT between '" + DateTimePicker1.Value + "' and '" + DateTimePicker2.Value + "'", con)

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Member 13890537

Спасибо ppolymorphe за ссылку и за исправление того, как я кодирую. Извините за опоздание, спасибо ^_^

Рейтинг:
0

OriginalGriff

Попробуйте между ними: SQL между операторами[^]

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?