第二个查询无法运行

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,因为我发现它们更容易使用,但这是首选。我还为MySqlConnectionMySqlCommand 对象实现了Using。这样可以正确处理对象,您不必担心这样做。

请注意,我不知道您的数据结构。我猜了MySqlDbTypes 是什么。你可能不得不改变。不过,我建议将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,是的,这就是我在重新阅读源代码时发现的。我已经更新了答案。我认为它适合你的建议。我唯一无法确认的是MySqlDbTypes。 是的,我认为 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...

【讨论】:

以上是关于第二个查询无法运行的主要内容,如果未能解决你的问题,请参考以下文章

了解 Postgresql 中的 EXPLAIN 函数

使用 Access 2007 查询向导创建 SQL,仍然无法在 VBA 中运行

无法打开()第二个文件 C

如何运行visual c++下多个cpp文件,就是在同一个项目下建立了多个.cpp源文件,但是无法生成,运行第二个

第二个和第三个分布式 Kafka 连接器工作人员无法正常工作

无法从 Oozie 工作流作业的第二次运行启动 Hive 操作