Dauda Muhammad Ответов: 1

Как вызвать нулевое значение а не между датами 1 и 2


Пожалуйста, помогите мне.
Я пытался вызвать нулевое значение и спящие транзакции, которые означают не между датами 1 и 2, но мой отчет crystal показывает пустое значение.
Я использую vb.net 2008 и crystal report.

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

dap = New OleDb.OleDbDataAdapter("SELECT * FROM tblRevenueRegister WHERE [Dte] NOT BETWEEN #" & dtpFromDate.Значение & "# и #" & dtpToDate.Стоимость усилителя; amp; "# и АМТ-это нулевой порядок по Ревид", передает CNN)

CHill60

Во - первых, не объединяйте строки для создания sql-используйте параметризованные запросы: Использование параметров с помощью DataAdapter[^Просто делая это, вы можете решить свою проблему.
Пробовали ли вы запустить этот запрос непосредственно к вашей базе данных, чтобы увидеть, что происходит (он подтверждает, является ли проблема с вашим sql или другим кодом)
Ты можешь попробовать

SELECT * FROM tblRevenueRegister WHERE NOT ([Dte] BETWEEN @FromDate AND @Todate) AND Amt IS NULL 

1 Ответов

Рейтинг:
0

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 не была выбрана никакая дата.
Используйте отладчик и выясните, что именно, а затем посмотрите, почему. Мы не можем сделать это для вас!