【问题标题】:Where I can use dispose? VB.Net我可以在哪里使用 dispose? VB.Net
【发布时间】:2018-12-11 18:05:57
【问题描述】:

任何人都可以帮助我将 dispose 方法放在这个上吗?这样我使用的变量就不会保存在内存中。我有我应该放在哪里或什么时候应该使用它。

我试过了

myQuery.Dispose()

但我认为我做错了。

Private Sub btnRegister_Click(sender As Object, e As EventArgs) Handles btnRegister.Click
    mysqlConn.Open()
    If TextBox01.Text = "" Or TextBox02.Text = "" Or TextBox04.Text = "" Or TextBox05.Text = "" Or TextBox06.Text = "" Then
        MsgBox("Please fill in all boxes")
        Exit Sub

    Else

        sqlCmd = New Odbc.OdbcCommand
        sqlCmd.Connection = mysqlConn
        sqlCmd.CommandType = CommandType.Text
        sqlCmd.CommandText = "select * from tbl_user where username='" & TextBox05.Text & "' Or email='" & TextBox04.Text & "' "
        dr = sqlCmd.ExecuteReader

        If dr.HasRows Then
            MsgBox("Username or Email already Exist", MsgBoxStyle.Critical)
        Else

            Dim myQuery As String

            myQuery = "INSERT INTO tbl_user(firstname, lastname, email, username, password) VALUES ('" & Replace(Trim(TextBox01.Text), "'", "''") & "', '" & Replace(Trim(TextBox02.Text), "'", "''") & "', '" & Replace(Trim(TextBox04.Text), "'", "''") & "', '" & Replace(Trim(TextBox05.Text), "'", "''") & "', '" & Replace(Trim(TextBox06.Text), "'", "''") & "')"


            sqlCmd = New Odbc.OdbcCommand
            sqlCmd.Connection = mysqlConn
            sqlCmd.CommandText = myQuery

            dr = sqlCmd.ExecuteReader

            MessageBox.Show("You are now register!", "System", MessageBoxButtons.OK)
            Me.Hide()
            frmMenu.Hide()
            frmLogin.Show()

            TextBox01.Text = ""
            TextBox02.Text = ""
            TextBox04.Text = ""
            TextBox05.Text = ""
            TextBox06.Text = ""
        End If
    End If
    mysqlConn.Close()
End Sub

【问题讨论】:

  • 为什么要处理字符串?
  • 我正在尝试处理我在所有文本框中输入的内容。这就是为什么我试图询问是否需要更改或执行某些操作才能使用 dispose
  • Dispose() 通常用于清理包含非托管(即 .NET/CLR 之外)资源的对象。 String 没有实现 Dispose() 因为它完全是托管内存;不需要非托管清理。如果您有不想在内存中闲逛的敏感信息,请查看SecureString
  • PS,帮自己一个忙,看看 SQL 参数化。您的 SQL 查询容易受到 SQL 注入攻击。将值连接到查询中,而不是使用参数,是不好
  • MySQL 有自己的提供者。使用起来会比 ODBC 好得多。在使用之前不要打开连接。您需要处理的对象是您的连接,可能还有阅读器和命令。 Using 块将为您解决问题,并在必要时关闭和处理对象。在实际应用程序中,密码永远不会以纯文本形式存储。

标签: mysql sql vb.net


【解决方案1】:

对象默认实现IDisposable interface,当Object.Finalize()被垃圾回收运行时会被自动销毁。

在您的问题中,您试图处置一个“技术上”是一个对象的字符串,但它是一个充当变量且不能被处置的对象。

如果你想在垃圾回收发生之前释放内存,你可以在 mysqlConn.close() 之后处理 mysqlConn。 sqlCmd 也可以被丢弃。不过,一般来说,除非您遇到要解决的特定问题(主要是内存限制),否则我不会使用 Dispose() 方法。 .NET 运行时可以很好地为您管理这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2013-03-25
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多