我该如何处理此错误:“对象无法从 dbnull 转换为其他类型。”?


你好,

我正在尝试使用以下代码从 VB.NET (Visual Studio) 连接到 MYSQLWorkbench 数据库:

Imports System.Data
Imports MySql.Data.MySqlClient
Imports MySql.Data

Public Class Form1

    Dim oCon As MySql.Data.MySqlClient.MySqlConnection


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim sProveedor As String

        sProveedor = "server = localhost; database = vikingos_barberia; user id = root; password = **********; port = 3306"
        oCon = New MySqlClient.MySqlConnection(sProveedor)

        oCon.Open()
        MsgBox("Conexion Exitosa!!")


    End Sub
End Class

我尝试过的:

这个参数我验证了好几次了,没有任何改变。

解决方案2

补充一下 Dave 所说的,情况更糟 – 您打开了一个与数据库的连接,该连接永远无法使用,因为它仅存储在局部变量中,该变量在 Form.Load 事件处理程序末尾超出了范围。

由于在方法外部根本无法访问它(实际上,当方法结束时,所有局部变量都不再存在),因此您创建的连接完全无用,只会占用服务器上的稀缺资源。

你应该总是我们 Using 阻止任何数据库对象(连接、命令、读取器和适配器)的创建,以便在阻止结束时自动关闭并处置它们:

VB
Using con As New SqlConnection(strConnect)
	con.Open()
	Using cmd As New SqlCommand("SELECT iD, description FROM myTable", con)
		Using reader As SqlDataReader = cmd.ExecuteReader()
			While reader.Read()
				Dim id__1 As Integer = CInt(reader("iD"))
				Dim desc As String = DirectCast(reader("description"), String)
				Console.WriteLine("ID: {0}" & vbLf & "    {1}", iD, desc)
			End While
		End Using
	End Using
End Using

解决方案1

您发布的代码不可能生成该错误。 该错误消息指的是转换从数据库中检索到的字段值为 DbNull 的内容,而您正尝试将其转换为另一种类型。

您发布的代码根本不执行查询。 您所做的就是在 Form_Load 事件中打开一个连接。

顺便说一句,您不应该打开与数据库的连接并在应用程序的生命周期内保持其打开状态。 您应该仅在需要执行查询时才打开与数据库的连接,并尽快关闭它。

解决方案3

问题是您正在使用 Oracle 的 bug 非常多的 MySql.Data 类库。 它维护得不好,应该避免。 它与较新版本的 MariaDB 不兼容,并且错误通常像您收到的错误一样荒谬。

相反,改用真正开源的 MySqlConnector。 代码是相同的,您只需更改每个模块或类顶部的 Imports 行。

コメント

タイトルとURLをコピーしました