第二个查询无法运行
Posted
技术标签:
【中文标题】第二个查询无法运行【英文标题】:2nd query fails to run 【发布时间】:2017-06-20 00:03:55 【问题描述】:我是编程新手,我对以下代码有疑问。第二个查询未运行。它应该将第一个数据库中的所有数据插入到另一个数据库中。
mysqlConn = New MySqlConnection
MySQLConn.ConnectionString = Connection
Adapter = New MySqlDataAdapter
Dim QRY = "SELECT EquipmentID, Quantity FROM subdbborroweq"
Dim EQID As Integer
Dim QTY As Integer
Dim TimeAndDate As String = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
Try
MySQLConn.Open()
Command = New MySqlCommand(QRY, MySQLConn)
Reader = Command.ExecuteReader
While Reader.Read()
EQID = Reader(0)
QTY = Reader(1)
Dim QRY1 = "INSERT INTO borrowlogs( `BorrowerName`, `EquipmentID`, `Quantity`, `TimeDate`) VALUES (" &
AddBorrower.TextBox1.Text & "," & EQID & ", " & QTY & "," &
TimeAndDate & ")"
Command = New MySqlCommand(QRY1, MySQLConn)
End While
MySQLConn.Close()
【问题讨论】:
据我所知,您没有执行命令。 " Command = New MySqlCommand(QRY1, MySQLConn)" 抱歉有点乱。我是新来的 执行该命令。Command.ExecuteNonQuery
你也应该看看使用参数。您对 SQL 注入持开放态度。
谢谢兄弟。对不起我的愚蠢问题。哈哈哈我真的是这个行业的新手。我希望你能教我,或者如果我再次遇到问题,我可以问你一个问题。
【参考方案1】:
我已经整理了一些代码,但请注意这是未经测试的,因为我不再使用 MySQL。
我使用了DataTable
而不是MySqlDataReader
,因为我发现它们更容易使用,但这是首选。我还为MySqlConnection
和MySqlCommand
对象实现了Using。这样可以正确处理对象,您不必担心这样做。
请注意,我不知道您的数据结构。我猜了MySqlDbType
s 是什么。你可能不得不改变。不过,我建议将TimeDate
保存为DateTime
。
您可能还想在row(0)
和row(1)
上进一步检查DBNulls
。我把这个留给你看,它可能没有必要,但总是值得研究的,因为它们确实会在突然出现时引起问题。
我不确定您希望如何处理从SELECT
语句中带回的DataTable
中的多行。所以我正在做的是循环遍历Rows
集合。如果您不想并且只想要第一行,您可以更改SELECT
语句以仅带回我认为使用LIMIT
完成的第一行。这意味着您的声明将类似于SELECT EquipmentID, Quantity FROM subdbborroweq LIMIT 1
。您可能希望使用WHERE
查看过滤器,并且可能需要考虑使用ORDER BY
对数据进行排序。或者删除 For Each row
循环并使用 Integer.TryParse(dt.Rows(0).Item(0).ToString(), EQID)
这是我整理的代码。它可能不是 100%,但希望它能给你一些东西:
Dim dt As New DataTable
Using con As New MySqlConnection(Connection),
cmd As New MySQLCommand("SELECT EquipmentID, Quantity FROM subdbborroweq", con)
con.open()
dt.Load(cmd.ExecuteReader)
If dt.Rows.Count > 0 Then
cmd.CommandText = "INSERT INTO borrowlogs(BorrowerName, EquipmentID, Quantity, TimeDate) VALUES (@Uname, @EQID, @QTY, @TAD)"
cmd.Parameters.Add("@Uname", MySqlDbType.VarChar)
cmd.Parameters.Add("@EQID", MySqlDbType.Int32)
cmd.Parameters.Add("@QTY", MySqlDbType.Int32)
cmd.Parameters.Add("@TAD", MySqlDbType.DateTime)
For Each row As DataRow In dt.Rows
cmd.Parameters("@Uname").Value = AddBorrower.TextBox1.Text
cmd.Parameters("@EQID").Value = row.Field(Of Int32)(0)
cmd.Parameters("@QTY").Value = row.Field(Of Int32)(1)
cmd.Parameters("@TAD").Value = DateTime.Now
cmd.ExecuteNonQuery()
Next
End If
End Using
【讨论】:
Add
的一个重载已被弃用 - (string, Object)
表单,因为它会导致与 AddWithValue 相同的猜谜游戏。 (所有提供者都一样:OleDB、MySQL、SQLite、ODBC、SQL Server 等)
@Plutonix,是的,这就是我在重新阅读源代码时发现的。我已经更新了答案。我认为它适合你的建议。我唯一无法确认的是MySqlDbType
s。
是的,我认为 OP 正在使用所有字符串。摆脱空的try / Catch-es,我会投票
@Plutonix 完成,感谢您的建议和支持。欣赏它。
仅供参考,您可以让 linq 为您转换 DR 值:Foo = dr.Field(Of Int32)(0) ... Bar = dr.Field(Of String)(1)
;你所拥有的比 OP 尝试的更好,但 Field(Of)
会比 ToString-TryParse 更干净【参考方案2】:
您的字符串值中不需要 ' 吗?值(“约翰”,
$QRY1 = "INSERT INTO borrowlogs( BorrowerName, EquipmentID, Quantity, TimeDate) VALUES ('" & AddBorrower.TextBox1.Text & "','" & EQID...
【讨论】:
以上是关于第二个查询无法运行的主要内容,如果未能解决你的问题,请参考以下文章
使用 Access 2007 查询向导创建 SQL,仍然无法在 VBA 中运行
如何运行visual c++下多个cpp文件,就是在同一个项目下建立了多个.cpp源文件,但是无法生成,运行第二个