Member 14611170 Ответов: 1

Datagrid показывает неправильный вывод в vb6


when i choose same date from month 10(say dtpckr1 = 02-10-2019 and dtpckr2 = 02-10-2019 ) ..data datagrid does not print anything and shows the msgbox not record found which i code for convinence...but when i choose start date from last moth and end date in this month(say dtpckr1 = 30-09-2019 and dtpckr2 = 02-10-2019 ) it shows all the data from month 09 and nothing from month 10 ... and the strange this is when choose date which is from moth 09 even if it is same(say dtpckr1 = 13-09-2019 and dtpckr2 = 13-09-2019 or 22-09-2019) it works perfectly i tried to attach screen shots but ..it showing server error...so please try to help me out by refering the following code .. I also checked the dataformat of database and my input,they are same...in databse the date datatype is "date/time" and format is "short date"....if have any other solution then please tell me... i will try... my purpose it to show datewise food orders in datagridview and then calculate the total sale... thanks


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

Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset

Private Sub cmdSearch_Click()

Dim date1 As Date
Dim date2 As Date

If IsNull(DTPicker1.Value And DTPicker2.Value) Then

    MsgBox "You must select date", vbCritical, "Warning"
    Exit Sub
End If
DTPicker1.Value = Format(DTPicker1.Value, "dd-mm-yyyy")
DTPicker2.Value = Format(DTPicker2.Value, "dd-mm-yyyy")
date1 = DTPicker1.Value
date2 = DTPicker2.Value
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\OrderMania\ordermania.mdb;Persist Security Info=False"
rs.CursorLocation = adUseClient

If DTPicker2.Value < DTPicker1.Value Then
MsgBox "End Date Cannot Be Lesser Then Start Date", vbCritical, "Wrong Input"
Exit Sub
Else
Adodc1.RecordSource = "select * from order1 where (date between #" & date1 & "# and #" & DTPicker2.Value & "#)"
Adodc1.Refresh
If Adodc1.Recordset.EOF Then
MsgBox "Please Enter Another Date", vbCritical, "No Record Found"
Else
Adodc1.Caption = Adodc1.RecordSource
End If
End If

con.Close

Call sale

End Sub


Public Sub sale()
Dim i As Integer
Dim Tot, gst, gtot As Double

For i = 0 To Adodc1.Recordset.RecordCount - 1
    Tot = Tot + CDbl(DataGrid1.Columns(5).Text)
    Adodc1.Recordset.MoveNext

Next i

Text1.Text = Tot
gst = Tot * 0.05
Text2.Text = gst
gtot = Tot + gst
Text3.Text = gtot
End Sub

1 Ответов

Рейтинг:
12

Maciej Los

Ну, в вашем коде мало ошибок...

1.


Самое главное, что ваш код является SQL-инъекция[^] уязвимый!
Adodc1.RecordSource = "select * from order1 where (CDate(date) between #" & date1 & "# and #" & DTPicker2.Value & "#)"

Не используйте конкатенацию строк! Скорее используйте параметризованные запросы.

Dim cmd As ADODB.Command
Dim sQry As String

'connection initialization here

sQry = "select * from order1 where dateField between ? and ?;"
Set cmd = New ADODB.Command
cmd.Activeconnection= con  
cmd.CommandText=sQry
cmd.parameters.Append cmd.CreateParameter(, adDate, adParamInput, , date1)
cmd.parameters.Append cmd.CreateParameter(, adDate, adParamInput, , date2)

'execute command here!


2.


Там есть список зарезервированные слова[^] для базы данных MS Access. Никогда не используйте их в качестве имен полей!
Например:
SELECT Date, Month
FROM order1

Обратите внимание, что Date и Month являются зарезервированными словами. Компонент Database engine не возвращает значения полей!
Даже если вы можете обойти это с помощью [] скобки вокруг зарезервированных слов:
SELECT [Date], [Month]
FROM order1

я не рекомендую этого делать! Вместо этого используйте пользовательское имя:
date -> orderdate
month -> ordermonth

и т.д.

3.


Используйте формат даты ISO: "MM/dd/yyyy"когда вы строите запрос вручную:
SELECT <Field_list>
FROM YourTable
WHERE DateField BETWEEN #10/02/2019# AND #10/03/2019#;


4.


Взгляните на подчеркнутую часть вашего запроса:
"select * from order1 where (CDate(date) between #" & date1 & "# and #" & DTPicker2.Value & "#)"

Ты пытаешься обратить меня в свою веру date поле для типа данных datetime. Есть ли причина хранить дату в виде строки? Используйте правильные типы данных!


Для получения более подробной информации, пожалуйста, смотрите:
ADODB: коллекция параметров[^]
VB6 - поиск имен таблиц/полей базы данных, которые являются зарезервированными словами-VBForums[^]


phil.o

5 ЕД

Maciej Los

Спасибо, Фил.

Member 14611170

Спасибо за ответ...я сделал все, что вы упомянули выше...но его показ error @requested operation требует объекта сеанса ole db, который не поддерживается текущим провайдером @ ....я новичок в vb6.. не могли бы вы отредактировать мой код, чтобы я мог напрямую скопировать вставить его... я знаю, что это звучит лениво..но я должен представить этот проект к завтрашнему дню я застрял в этом коде с las t 2 дней, и это единственный код, который беспокоит меня me...it будет очень полезно, если вы отредактируете мой код в соответствии с вашими предложениями...спасибо

Maciej Los

Перейдите по ссылке, чтобы решить еще одну проблему: Быстрый совет: Ошибка времени выполнения соединения VBA ADO ‘3709’ – разработка для Dynamics GP[^]
Примечание: у меня нет доступа к вашей базе данных, и я не могу читать прямо с вашего экрана. Вы должны отладить свою программу, чтобы выяснить, что не так.

Member 14611170

пожалуйста ответьте

Richard Deeming

sQry = "select * from order1 where dateField between #?# and #?#;"

Я не думаю, что вам нужны октоторпы там, когда вы используете параметры. :)
sQry = "select * from order1 where dateField between ? and ?;"

Maciej Los

Ты прав, Ричард. Это ошибка копирования-вставки-замены ;)