Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Sqlite在一个数据库读取上抛出null异常,但在另一个数据库读取上不抛出null异常_Vb.net_Sqlite - Fatal编程技术网

Vb.net Sqlite在一个数据库读取上抛出null异常,但在另一个数据库读取上不抛出null异常

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

我在VB.NET sqlite代码块中有两个SELECT语句

第一个块返回一个值,第二个块返回一个空引用,对象异常。两个表都有相同的日期列。它们来自同一数据库中的两个不同表。参数引用from和to“日期时间选择器”。数据库设置为日期。这是街区

有什么帮助吗

使用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