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 中的 datetime sql server 类型操作日期和时间