Vb.net Sqlite在一个数据库读取上抛出null异常,但在另一个数据库读取上不抛出null异常
我在VB.NET sqlite代码块中有两个SELECT语句 第一个块返回一个值,第二个块返回一个空引用,对象异常。两个表都有相同的日期列。它们来自同一数据库中的两个不同表。参数引用from和to“日期时间选择器”。数据库设置为日期。这是街区 有什么帮助吗Vb.net Sqlite在一个数据库读取上抛出null异常,但在另一个数据库读取上不抛出null异常,vb.net,sqlite,Vb.net,Sqlite,我在VB.NET sqlite代码块中有两个SELECT语句 第一个块返回一个值,第二个块返回一个空引用,对象异常。两个表都有相同的日期列。它们来自同一数据库中的两个不同表。参数引用from和to“日期时间选择器”。数据库设置为日期。这是街区 有什么帮助吗 使用con作为新的SQLiteConnection(connstring) con.Open() 使用cmd作为新的SQLiteCommand cmd.Connection=con cmd.CommandText=“从ID>0的clienti
使用con作为新的SQLiteConnection(connstring)
con.Open()
使用cmd作为新的SQLiteCommand
cmd.Connection=con
cmd.CommandText=“从ID>0的clientinfo中选择计数(*)”
如果cmd.ExecuteScalar=0,则
出口接头
其他的
'添加选定的潜在客户
cmd.CommandText=“从Leaddata中选择Count(LeadID)ld,其中Capptdate介于@dtfrom22和@dtto22之间”
cmd.Parameters.Add(“@dtfrom22”,SqlDbType.Date).Value=dtstatsfrom.Value
cmd.Parameters.Add(“@dtto22”,SqlDbType.Date).Value=dtStatsTo.Value
Dim RDR作为SQLiteDataReader
RDR=cmd.ExecuteReader
使用RDR
txtstatstotalleads.Text=0
而RDR.Read()
txtstatstotalleads.Text=RDR.Item(“ld”).ToString()
结束时
终端使用
'添加选定的销售
cmd.CommandText=“从Salesdata中选择Count(SalesID)sd,其中saledate介于@dtStatsFrom23和@dtStatsTo23之间”
cmd.Parameters.Add(“@dtStatsfrom23”,SqlDbType.Date).Value=dtstatsfrom.Value
cmd.Parameters.Add(“@dtStatsto23”,SqlDbType.Date).Value=dtStatsTo.Value
RDR=cmd.ExecuteReader
使用RDR
txtstatsales.Text=0
而RDR.Read()
txtstatsales.Text=RDR.Item(“sd”).ToString()
结束时
终端使用
'将平均佣金添加到统计表
cmd.CommandText=“从SalesData中选择平均(佣金)cm,其中saledate介于@dtfrom24和@dtto24之间”
cmd.Parameters.Add(“@dtfrom24”,SqlDbType.Date).Value=dtstatsfrom.Value
cmd.Parameters.Add(“@dtto24”,SqlDbType.Date).Value=dtStatsTo.Value
RDR=cmd.ExecuteReader
使用RDR
txtstatcommmavg.Text=0
而RDR.Read()
txtstatcommavg.Text=RDR.Item(“cm”).ToString()
结束时
终端使用
如果结束
终端使用
终端使用
这里最重要的是,您永远不会执行第二个查询您需要再次调用cmd.ExecuteReader()
。
但还有更多。此与
在这里是错误的:
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()
如果不小心使用,可能会导致性能问题(在这种特定情况下可能没问题,但养成使用这种其他模式的习惯是很好的):
“添加所选销售
cmd.CommandText=“从Salesdata中选择Count(SalesID)sd,其中saledate介于@dtStatsFrom23和@dtStatsTo23之间”
cmd.Parameters.Add(“@dtStatsfrom23”,SqlType.Date).Value=dtstatsfrom.Value
cmd.Parameters.Add(“@dtStatsto23”,SqlType.Date).Value=dtStatsTo.Value
使用RDR=cmd.ExecuteReader()
txtstatsales.Text=0
而RDR.Read()
txtstatsales.Text=RDR(“sd”).ToString()
结束时
终端使用
根据对问题的更新,我建议进行初始修订,如下所示。这不会解决一切,但会给我们更好的工作基础。另外,为了真正提出完整的修复方案,我需要查看存储在表中的日期值的示例
使用con作为新的SQLiteConnection(connstring)_
cmd作为新的SQLiteCommand(“从clientinfo中选择Count(*),其中ID>0”,con)
con.Open()
如果CInt(cmd.ExecuteScalar())=0,则退出Sub
cmd.CommandText=“选择Leaddata中的计数(LeadID)ld,其中Capptdate介于@dtFrom和@dtTo;之间”&vbCrLf
cmd.CommandText&=“从Salesdata中选择Count(SalesID)sd,Avg(CommissionAmt)cm,其中saledate介于@dtFrom和@dtTo之间
cmd.Parameters.Add(“@dtFrom”,SqliteType.Text).Value=dtstatsfrom.Value
cmd.Parameters.Add(“@dtTo”,SqliteType.Text).Value=dtStatsTo.Value
将RDR用作SQLiteDataReader=cmd.ExecuteReader()
'添加选定的潜在客户
txtstatstotalleads.Text=“0”
而RDR.Read()
txtStatsTotalEADS.Text=RDR(“ld”).ToString()
结束时
RDR.NextResult()
'添加选定的销售和平均佣金
txtstatsales.Text=“0”
txtstatcommavg.Text=“0”
而RDR.Read()
txtstatsales.Text=RDR(“sd”).ToString()
txtstatcommavg.Text=RDR(“cm”).ToString()
结束时
终端使用
终端使用
请注意,我是如何减少缩进的,缩进使代码更容易理解,并且通过将两个查询放在同一语句中,将两个字段放在一个查询中,将到数据库的往返减少到一个
但我仍然需要查看表中的示例数据,以了解这些日期的格式dtStatsFrom.Value
和dtStatsTo.Value
是DateTime
值,现在您将获得默认的ToString()
结果。我们需要为这些值显式调用.ToString()
,使用重载指定与表中数据匹配所需的确切格式字符串。。。我们需要希望数据的格式能够使其实用化
'Add avg COMMISION TO stats FORM
cmd.CommandText = "Select Avg(CommissionAmt) cm From SalesData where saledate between @dtfrom24 and @dtto24"
cmd.Parameters.Clear '<<--Add This
cmd.Parameters.Add("@dtfrom24", SqlDbType.Date).Value = dtstatsfrom.Value
cmd.Parameters.Add("@dtto24", SqlDbType.Date).Value = dtStatsTo.Value
'Put the using statement before you use assign the reader
Using RDR1 As New SQLiteDataReader 'Just try changing the name of the reader
RDR1 = cmd.ExecuteReader
txtStatsCommAvg.Text = 0
While RDR1.Read()
txtStatsCommAvg.Text = RDR1.Item("cm").ToString()
End While
End Using
enter cmd.CommandText = "Select A.num, A.Denom, Cast(A.num as Float)/Cast(A.Denom as float) as rnp From(Select(Select CAST(count(Result) as Decimal(5,2))" _
& "from LeadData where (Result = 'Refusal')and CApptDate between @dtfrom49 and @dtto49 as num," _
& "(select cast(count(leadid) as decimal(5,2)) from LeadData where CApptDate between @dtfrom50 and @dtto50) as Denom)A "
cmd.Parameters.Add("@dtStatsfrom49", SqlDbType.Date).Value = txtStatsFrom.Text
cmd.Parameters.Add("@dtStatsto49", SqlDbType.Date).Value = txtStatsTo.Text
cmd.Parameters.Add("@dtStatsfrom50", SqlDbType.Date).Value = txtStatsFrom.Text
cmd.Parameters.Add("@dtStatsto50", SqlDbType.Date).Value = txtStatsTo.Text
RDR = cmd.ExecuteReader
Using RDR
txtStatsRefusalPercent.Text = 0
While RDR.Read()
txtStatsRefusalPercent.Text = RDR.Item("rnp").ToString()
End While
End Usingcode here