Самое важное здесь , вы никогда не выполняете второй запрос . Вам нужно снова позвонить cmd.ExecuteReader()
.
Но есть и еще кое-что. Это With
здесь не так:
With RDR.Read
txtStatsSales.Text = RDR.Item("sd").ToString()
End With
Это на самом деле не проверяет результат функции Read()
(и сейчас в современном VB более идиоматично всегда использовать круглые скобки с вызовами функций). Вы, вероятно, хотели это:
If RDR.Read() Then
txtStatsSales.Text = RDR.Item("sd").ToString()
End If
Кроме того, здесь чаще используется цикл While
, , даже если вы ожидаете только одну (или нет) запись , и в этой ситуации проверять HasRows
не нужно и не полезно. Кроме того, AddWithValue()
может вызвать проблемы с производительностью, если не использовать его осторожно (вероятно, в данном конкретном случае это нормально, но полезно иметь привычку использовать этот другой шаблон):
'add selected Sales
cmd.CommandText = "SELECT Count(SalesID) sd FROM Salesdata WHERE saledate BETWEEN @dtStatsFrom23 AND @dtStatsTo23"
cmd.Parameters.Add("@dtStatsfrom23", SqlType.Date).Value = dtstatsfrom.Value
cmd.Parameters.Add("@dtStatsto23", SqlType.Date).Value = dtStatsTo.Value
Using RDR = cmd.ExecuteReader()
txtStatsSales.Text = 0
While RDR.Read()
txtStatsSales.Text = RDR("sd").ToString()
End While
End Using
На основании обновления вопроса я предлагаю начальную ревизию, как показано ниже. Это не все исправит, но даст нам лучшую основу для работы. Кроме того, чтобы действительно предлагали полное исправление, мне нужно увидеть образец значений даты, поскольку они хранятся в таблицах.
Using con As New SQLiteConnection(connstring), _
cmd As New SQLiteCommand("SELECT Count(*) FROM clientinfo WHERE ID > 0", con)
con.Open()
If CInt(cmd.ExecuteScalar()) = 0 Then Exit Sub
cmd.CommandText = "SELECT Count(LeadID) ld FROM Leaddata WHERE Capptdate between @dtFrom and @dtTo;" & vbCrLf
cmd.CommandText &= "SELECT Count(SalesID) sd, Avg(CommissionAmt) cm FROM Salesdata WHERE saledate between @dtFrom and @dtTo;"
cmd.Parameters.Add("@dtFrom", SqliteType.Text).Value = dtstatsfrom.Value
cmd.Parameters.Add("@dtTo", SqliteType.Text).Value = dtStatsTo.Value
Using RDR As SQLiteDataReader = cmd.ExecuteReader()
' add selected leads
txtstatstotalleads.Text = "0"
While RDR.Read()
txtstatstotalleads.Text = RDR("ld").ToString()
End While
RDR.NextResult()
'add selected Sales and avg commission
txtStatsSales.Text = "0"
txtStatsCommAvg.Text = "0"
While RDR.Read()
txtStatsSales.Text = RDR("sd").ToString()
txtStatsCommAvg.Text = RDR("cm").ToString()
End While
End Using
End Using
Обратите внимание, как мне удалось уменьшить отступы, что облегчает отслеживание кода, а также сокращает количество обращений к базе данных до одного, помещая два запроса в одном выражении и два поля в один запрос.
Но мне все еще нужно посмотреть образцы данных из таблицы, чтобы узнать, как эти даты действительно отформатированы. dtStatsFrom.Value
и dtStatsTo.Value
являются значениями DateTime
, и сейчас вы получаете результат по умолчанию ToString()
. Нам нужно явно вызвать .ToString()
для этих значений, используя перегрузку, которая указывает точную строку формата, которая нам нужна для соответствия данным в таблице ... и мы должны надеяться, что данные отформатированы таким образом, чтобы это практично. Если у вас есть первый в месяц формат, распространенный в США, выражения BETWEEN
по-прежнему обрабатывают их как string , а не даты , и вы не увидите ожидаемых результатов.