Vb.net &引用;对象不能从dbnull强制转换为其他类型;当SELECTSQL查询运行时

Vb.net &引用;对象不能从dbnull强制转换为其他类型;当SELECTSQL查询运行时,vb.net,Vb.net,我正在进一步了解这个“对象不能从dbnull转换为其他类型”错误。但我找不到解决问题的可能答案 Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click 'query = "SELECT sum(fuel) as ttlfuel, sum(stationery) as ttlstationery, sum(salary) as ttlsalary, sum(v_

我正在进一步了解这个“对象不能从dbnull转换为其他类型”错误。但我找不到解决问题的可能答案

Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click

            'query = "SELECT sum(fuel) as ttlfuel, sum(stationery) as ttlstationery, sum(salary) as ttlsalary, sum(v_part) as ttlvp, sum(other) as ttlother FROM mcs.expenses WHERE datee BETWEEN #" & dtpisf.Value.ToString & "# AND #" & dtpist.Value.ToString & ""
    Dim cmd = New MySqlCommand(query, con)
    Dim dr As MySqlDataReader
    Try
        con.Open()
        dr = cmd.ExecuteReader()
        While dr.Read()
            Me.txtfuel.Text = Convert.ToDecimal(dr("ttlfuel"))
            ' Me.txtstationary.Text = Convert.ToDecimal(dr("ttlstationery"))
            'Me.txtcollectorsalery.Text = Convert.ToDecimal(dr("ttlsalary"))
            'Me.txtvehiclepart.Text = Convert.ToDecimal(dr("ttlvp"))
            'Me.txtotherexpenses.Text = Convert.ToDecimal(dr("ttlother"))
        End While
        dr.Close()
        con.Close()

    Catch ex As Exception
        MsgBox(ex.Message)
        Try
            If (con.State = ConnectionState.Open) Then
                con.Close()
            End If
        Catch ex2 As Exception
            MsgBox(ex2.Message)
        End Try
    End Try
在我的程序中,我有一个按钮,我对它进行编码以得到每列的总和。特别的是我想通过日期时间选择器在两个日期之间过滤这些数据。(dtpisf和dtpist)。 我的数据表名是expenses。所有数据行至少有0个值。
任何人都可以提供帮助?

撇开注释中列出的其他问题不谈(例如,使用命令和SQLParameters而不是动态字符串),我认为您当前的问题在于您假设您的字段:

(a) 有价值

(b) 存储正确的值类型以转换为所需的数据类型

您可以轻松地使用扩展方法进行检查(下面是vb.net代码):

或者,对于十进制:

decimal myValue = dr.GetOrDefault(of decimal)("ttlfuel", 0)
Me.txtfuel.Text = myValue.toString("#,##0.00")

此外,我将在代码中启用选项strict。如果您这样做了,您将在编译时捕获像这样的问题(而不是在运行时遇到它们)。而且,如果你能让@puropoix给你一个答案。。。我同意。

撇开注释中列出的其他问题不谈(例如,使用命令和SQLParameters而不是动态字符串),我认为您当前的问题是您假设您的字段:

(a) 有价值

(b) 存储正确的值类型以转换为所需的数据类型

您可以轻松地使用扩展方法进行检查(下面是vb.net代码):

或者,对于十进制:

decimal myValue = dr.GetOrDefault(of decimal)("ttlfuel", 0)
Me.txtfuel.Text = myValue.toString("#,##0.00")


此外,我将在代码中启用选项strict。如果您这样做了,您将在编译时捕获像这样的问题(而不是在运行时遇到它们)。而且,如果你能让@puropoix给你一个答案。。。我同意。

在将这些字段分配给变量或控件之前,必须检查这些字段是否为DbNull(缺少数据)。我想您的注释掉的查询并不是真正注释掉的。对吧?恶心。不要使用SQL参数,也不要勾选日期,如果是日期列,请使用
dtpisf.Value
。“BETWEEN”也有问题,但我现在在数据库中找不到链接。我还使用“Date”作为where Date time picker在表中查找值的类型。当查询运行时(如标题中所示),您是否真的遇到错误?或者稍后,当您尝试将
dr(“xxxx”)
项分配给某个对象时?在尝试将这些字段分配给变量或控件之前,必须检查这些字段是否为DbNull(缺少数据)。我想您的注释掉的查询并不是真正注释掉的。对吧?恶心。不要使用SQL参数,也不要勾选日期,如果是日期列,请使用
dtpisf.Value
。“BETWEEN”也有问题,但我现在在数据库中找不到链接。我还使用“Date”作为where Date time picker在表中查找值的类型。当查询运行时(如标题中所示),您是否真的遇到错误?或者稍后,当您尝试将
dr(“xxxx”)
项分配给某个对象时,请在项目中创建一个新文件,键入“module”并将其添加到该文件中。您的分机将自动接通。先生!,我将其添加到新模块中,但在“行作为DataReader”行中,出现了一个错误。它显示datareader红色下划线OK。您是否尝试替换为特定类型:System.Data.SqlClient.SqlDataReader(上面编辑的答案)。先生,没关系。但有一个问题。我添加了“Me.txtfoure.Text=dr.GetOrDefaultValue(字符串的)(“ttlfuel”,即“)”代码,并且在“GetOrDefaultValue”处显示错误,先生,我更改了“GetOrDefault”,但在“GetOrDefault”下保持蓝色下划线。正如你所说,我公开了这个模块。但我想我再次调用此表单的模块。在项目中创建一个新文件,键入“模块”并将其添加到其中。您的分机将自动接通。先生!,我将其添加到新模块中,但在“行作为DataReader”行中,出现了一个错误。它显示datareader红色下划线OK。您是否尝试替换为特定类型:System.Data.SqlClient.SqlDataReader(上面编辑的答案)。先生,没关系。但有一个问题。我添加了“Me.txtfoure.Text=dr.GetOrDefaultValue(字符串的)(“ttlfuel”,即“)”代码,并且在“GetOrDefaultValue”处显示错误,先生,我更改了“GetOrDefault”,但在“GetOrDefault”下保持蓝色下划线。正如你所说,我公开了这个模块。但我想我再次调用这个表单的模块。
decimal myValue = dr.GetOrDefault(of decimal)("ttlfuel", 0)
Me.txtfuel.Text = myValue.toString("#,##0.00")