VB.NET 从 `Byte()` 类型到类型 'String is not Valid' 的转换

Posted

技术标签:

【中文标题】VB.NET 从 `Byte()` 类型到类型 \'String is not Valid\' 的转换【英文标题】:VB.NET Conversion from type `Byte()` to type 'String is not Valid''VB.NET 从 `Byte()` 类型到类型 'String is not Valid' 的转换 【发布时间】:2021-02-22 10:10:33 【问题描述】:

我正在尝试在标签中显示用户数,但遗憾的是显示从类型 Byte() 转换为类型“字符串无效”的错误

 Dim Number2 As String = "SELECT CASE WHEN GROUP_CONCAT(DISTINCT t.number) IS NULL
                                            THEN '0'
                                            WHEN GROUP_CONCAT(DISTINCT t.number) = ''
                                            THEN '0'
                                            ELSE SUM(t.number)    END  as 'Total'
                                FROM types_of_learners t JOIN
                                blh_location blhloc
                                ON t.blh_location_userid=blhloc.blh_id
                                WHERE t.date_submitted >= date_sub(curdate(), interval 0 day) 
                                AND t.tol='Associations'
                                AND blhloc.blh_barangay='" & locationtxt.Text & "'"
        da = New mysqlDataAdapter(Number2, mycon)
        dt = New DataTable()
        da.Fill(dt)
        txtNo2.Text = dt.Rows(0)("Total")

当我尝试将字符串更改为整数时,会出现不同的显示,这就是它所说的 '从字符串 "SELECT CASE WHEN GROUP_CONCAT(DI" 到类型 'Integer' 的转换无效。'

【问题讨论】:

你真的需要那个 GROUP_CONCAT 函数吗?您可以使用 COALESCE 求和避免空值 检查什么数据类型设置为数据库中的数字列?? 顺便说一下,您应该养成使用 SQL 参数来表示 locationtxt.Text 等值的好习惯。否则,如果有人不小心输入了撇号,或者有人故意用SQL injection attack 闯入数据库,它就会中断。 this question中有一个例子。 【参考方案1】:

尝试使用

txtNo2.Text = dt.Rows(0)("Total").ToString()

【讨论】:

代码字,但它在文本框上显示“System.Byte[]” 没关系,我试试这个 "Allow User Variables=True;Respect Binary flags=false" codeproject.com/Questions/695619/…【参考方案2】:

您可以避免 GROUP_CONCAT 强制您使用字符串表达式,因为 SUM 本身会忽略 NULL 值

Dim Number2 As String = "SELECT SUM(t.number) as 'Total'
                         .....

并且,作为旁注。这一行

    AND blhloc.blh_barangay='" & locationtxt.Text & "'"

是一个众所周知的安全问题,因为它允许执行 SQL 注入攻击。使用 always 参数,如

    .....
    AND blhloc.blh_barangay=@loc"

    da = New MySqlDataAdapter(Number2, mycon)
    da.SelectCommand.Parameters.Add("@loc", MySqlDbType.VarChar).Value = locationtxt.Text
    dt = New DataTable()
    da.Fill(dt)
    txtNo2.Text = dt.Rows(0)("Total")

【讨论】:

以上是关于VB.NET 从 `Byte()` 类型到类型 'String is not Valid' 的转换的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 如何将字符串转换为integer类型的数据?

如何检查字节是不是为空 vb.net

从 vb.net 中的 datetime sql server 类型操作日期和时间

标准表达式中的数据类型不匹配(vb.net,访问)

VB.NET ArrayList 到 List(Of T) 类型的复制/转换

在 VB.net 中将多种文件类型保存到一个 potobuf-net 化的文件中