我正在使用Datagridview
并获取单元格值。我需要做的是,当pieces
的单元格中有DatagridView
字符串值时,我将其在我的查询中更改为“无”。我已经使用case
查询了,我认为这不是解决问题的正确答案。你能帮帮我们吗?
顺便说一下,这是我的代码,我已经完成了。
For k As Integer = 0 To dtgOrder.RowCount - 1
objconn.Open()
cmbQuery = "SELECT product_quantity.Quantity As 'quant_test' from product_quantity
INNER join product_table on product_quantity.Product_ID = product_table.Product_ID
where product_size.Size_Name
= '" & If dtgOrder.Rows(k).Cells(3).Value = "pieces" Then
dtgOrder.Rows(k).Cells(3).Value = "None"
End If & "'"
objcmd = New MySqlCommand(cmbQuery, objconn)
objdr = objcmd.ExecuteReader
While objdr.Read
quantitytesting = objdr.GetInt32("quant_test")
End While
objconn.Close()
Next
这是我在Case
使用mysql的查询,我也已将其应用于上述查询。
SELECT product_quantity.Quantity As 'quant_test' from product_quantity
INNER join product_table on product_quantity.Product_ID = product_table.Product_ID
where product_size.Size_Name
= (Case when '"& dtgOrder.Rows(k).Cells(3).Value = "pieces" &"' Then 'None' Else '"& dtgOrder.Rows(k).Cells(3).Value &"')"
答案 0 :(得分:0)
要理解的第一个,也是最重要的事情是,您应该从不使用字符串连接将值放入SQL查询中。到目前为止,您所拥有的代码只是乞求让您的数据库遭到攻击。
除此之外,这里有两种可能的解决方案。
在VB中:
Const SQL As String = _
"SELECT product_quantity.Quantity As 'quant_test' " &
" FROM product_quantity " &
" INNER join product_table on product_quantity.Product_ID = product_table.Product_ID " &
" WHERE product_size.Size_Name = @SizeName"
= '
Using cn As New MySlConnection("connection string here"),
cmd As New MySqlCommand(SQL, cn)
Dim p As MySqlParameter = cmd.Parameters.Add("@SizeName", MySqlDbType.VarString)
cn.Open()
For Each row As DataGridViewRow In dtgOrder.Rows
p.Value = If(row.Cells(3).Value = "pieces", "None", row.Cells(3).Value)
Using objdr As MySqlDataReader = cmd.ExecuteReader()
While objdr.Read
quantitytesting = objdr.GetInt32("quant_test")
End While
End Using
Next
End Using
此代码与原始代码相比有许多重要的改进,因此请研究该模式以供将来使用。但是,虽然我在这里,但我还要补充一点,在使用DataGridView的循环中看到这样的查询非常奇怪。 DataGridView中的行几乎肯定来自数据库,这意味着您应该能够构建单个查询来生成结果,而不需要任何循环。将此内容放入单个查询中将比使数据库多次运行更好,更好。
在SQL中:
Const SQL As String = _
"SELECT product_quantity.Quantity As 'quant_test' " &
" FROM product_quantity " &
" INNER join product_table on product_quantity.Product_ID = product_table.Product_ID " &
" WHERE product_size.Size_Name = COALESCE(NULLIF(@SizeName, 'pieces'),'None')"
= '
Using cn As New MySlConnection("connection string here"),
cmd As New MySqlCommand(SQL, cn)
Dim p As MySqlParameter = cmd.Parameters.Add("@SizeName", MySqlDbType.VarString)
cn.Open()
For Each row As DataGridViewRow In dtgOrder.Rows
p.Value = row.Cells(3).Value
Using objdr As MySqlDataReader = cmd.ExecuteReader()
While objdr.Read
quantitytesting = objdr.GetInt32("quant_test")
End While
End Using
Next
End Using
在我选择的两个选项中,我更喜欢第一个...让客户端应用程序执行此特定工作而不是数据库。我发布这个是因为如果你试图将它归结为单个SQL语句,你可能需要这个逻辑才能使它工作。