vb.net select 语句失败
vb.net select statement failing
我有此代码来填充 DataGridView (DGV),目标是仅使用 LinkTable 中的数据填充 DGV,其中一个字段 ytSiteType 等于另一个表单上设置的全局变量。变量是 gvSLT,我已经测试过 gvSLT 以正确的值进入新表单。
我通过向 SQLiteDataReader 例程添加 If 语句解决了这个问题。
我将 post 下面的代码加上这两行失败的代码。
cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType =" & gvSLT
cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = 'gvSLT'"
这是有效的代码
Using conn As New SQLiteConnection($"Data Source = '{gv_dbName}';Version=3;")
conn.Open()
Using cmd As New SQLiteCommand("", conn)
cmd.CommandText = "SELECT * FROM LinkTable"
'cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType =" & gvSLT
'cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = 'gvSLT'"
'cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = 'News'"
Using rdr As SQLite.SQLiteDataReader = cmd.ExecuteReader
'dgvLinks.DataSource = rdr
'Statement Above use when DB is bound to dgvLinks
'=================================================
While rdr.Read()
intID = CInt((rdr("LID")))
strChannelName = rdr("ytChannelName").ToString
strLinkAddress = rdr("ytLinkAddress").ToString
strLinkType = rdr("ytSiteType").ToString
If strLinkType = gvSLT Then
dgvLinks.Rows.Add(intID, strChannelName, strLinkAddress)
rowCount = rowCount + 1
End If
End While
End Using
问题是“为什么注释掉的 SELECT 语句失败了”
你的第一个例子失败了,因为,如果 ytSiteType 是一个字符串类型的字段,你是在连接 gvSLT 的值而不把它放在一起在单引号内。
第二个示例失败,因为您将文字文本“gvSLT”放在单引号内,而不是 gvSLT.
的值
第三个例子,我不确定,但可能会失败,因为没有完全符合“News”值的记录。
如果输入 gvSLT 本身包含一个或多个单引号,您应该始终使用参数来避免这些问题和其他问题,例如 SqlInjection、解析数值中的小数点分隔符和问题。
所以一个简单的解决方案应该是:
cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = @site"
cmd.Parameters.Add("@site", DbType.String).Value = gvSLT
我有此代码来填充 DataGridView (DGV),目标是仅使用 LinkTable 中的数据填充 DGV,其中一个字段 ytSiteType 等于另一个表单上设置的全局变量。变量是 gvSLT,我已经测试过 gvSLT 以正确的值进入新表单。
我通过向 SQLiteDataReader 例程添加 If 语句解决了这个问题。
我将 post 下面的代码加上这两行失败的代码。
cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType =" & gvSLT
cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = 'gvSLT'"
这是有效的代码
Using conn As New SQLiteConnection($"Data Source = '{gv_dbName}';Version=3;")
conn.Open()
Using cmd As New SQLiteCommand("", conn)
cmd.CommandText = "SELECT * FROM LinkTable"
'cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType =" & gvSLT
'cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = 'gvSLT'"
'cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = 'News'"
Using rdr As SQLite.SQLiteDataReader = cmd.ExecuteReader
'dgvLinks.DataSource = rdr
'Statement Above use when DB is bound to dgvLinks
'=================================================
While rdr.Read()
intID = CInt((rdr("LID")))
strChannelName = rdr("ytChannelName").ToString
strLinkAddress = rdr("ytLinkAddress").ToString
strLinkType = rdr("ytSiteType").ToString
If strLinkType = gvSLT Then
dgvLinks.Rows.Add(intID, strChannelName, strLinkAddress)
rowCount = rowCount + 1
End If
End While
End Using
问题是“为什么注释掉的 SELECT 语句失败了”
你的第一个例子失败了,因为,如果 ytSiteType 是一个字符串类型的字段,你是在连接 gvSLT 的值而不把它放在一起在单引号内。
第二个示例失败,因为您将文字文本“gvSLT”放在单引号内,而不是 gvSLT.
的值第三个例子,我不确定,但可能会失败,因为没有完全符合“News”值的记录。
如果输入 gvSLT 本身包含一个或多个单引号,您应该始终使用参数来避免这些问题和其他问题,例如 SqlInjection、解析数值中的小数点分隔符和问题。
所以一个简单的解决方案应该是:
cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = @site"
cmd.Parameters.Add("@site", DbType.String).Value = gvSLT