OriginalGriff
Не делайте этого так: никогда не объединяйте строки для построения 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.
Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
В этом случае это не вызовет проблем с впрыском, но у него будут другие проблемы, потому что дата будет преобразована в строку и должна быть преобразована обратно в значение DATETIME механизмом БД, что может пойти не так - предполагая, что ваш
Dte
столбец-это столбец даты или времени, а не NVARCHAR. Если это NVARCHAR, то он потерпит неудачу, потому что строки сравниваются символ за символом, а результат сравнения определяется первой другой парой символов.
Так что исправьте конкатенацию во всем вашем приложении, а затем протестируйте это снова. Если это все еще не удается, нам нужно будет увидеть ваше определение таблицы и примеры данных.
Dauda Muhammad
Спасибо CHill60 за ваше предложение
Я использовал приведенный ниже запрос, но отобразил ошибку "нет значения для одного или нескольких требуемых параметров".
Dim dfrom As Date = frmRevenueUnpaidReport.dtpFromDate.Ценность
Дим ДТО как дата = frmRevenueUnpaidReport.dtpToDate.Ценность
dap = New OleDb.OleDbDataAdapter("SELECT * FROM tblRevenueRegister WHERE NOT ([Dte] BETWEEN @FromDate AND @Todate) AND Amt IS NULL Order By RevID", Cnn)
скока.Команды selectcommand.Параметры.AddWithValue("@FromDate", dfrom)
скока.Команды selectcommand.Параметры.AddWithValue("@Todate", dto)
dap.Fill(ds, "tblRevenueRegister")
РПТ.SetDataSource(ДС)
OriginalGriff
Тогда либо dfrom, либо dto имеют значение null, что означает, что в DTP не была выбрана никакая дата.
Используйте отладчик и выясните, что именно, а затем посмотрите, почему. Мы не можем сделать это для вас!