如果这是 MariaDb,那么您想使用 MySql 的提供程序。不是 ODBC 也不是 OleDb。难怪你会遇到问题。与初学者常用的 Access 数据库相比,该数据库的可用信息并不多。
除了使用数据库对象的方法之外,不要在任何地方声明数据库对象。您可以在类级别为连接字符串声明一个 Private 变量。
尽管其中一个是模块级变量,另一个是局部变量,但这是非常令人困惑和不好的做法。为什么将连接对象称为字符串?
Public sGlobalConnectionString As String
Dim sGlobalConnectionString As New OleDb.OleDbConnection
顺便说一句,在一行中声明和初始化变量是可以的。
Dim sDataserver = "localhost"
您在 Sub Main 的第一行创建一个新连接,然后将其丢弃并在最后一行创建另一个新连接。由于 sDataServer 和 sDatabaseName 是硬编码的,为什么不直接将文字值直接放入连接字符串中。
毕竟你通过了conStr
到连接的构造函数而不是sDatabaseConnection
。你为什么要建造sDatabaseConnection
(另一个用词不当,它不是一个连接,它是一个字符串),然后永远不要使用它。有conStr
已设置在其他地方?
无论如何,扔掉整个模块。
继续你的DataQuery
班级。首先,名称应以大写字母开头。
摆脱Class_initialize
。除了使用连接的方法之外,我们不想创建或打开任何连接。你从不打电话Class_Terminate
所以也把它扔掉。
The GetRecordDataSet
方法...
vb.net 中的函数需要数据类型。将返回值分配给函数名称的旧 VB6 语法可以工作,但这不是 .net 方式。在vb.net中我们使用Return
关键词。
您尚未初始化或指定数据类型arrParameter
, arrParamName
or sDataValue
这违反了 Option Strict。 (你确实有 Option Strict On,不是吗?)
On Error GoTo errhandler
是 VB6 的一个悲伤的遗留物。 .net 语言具有结构化错误处理Try...Catch...Finally...End Try
.
cmd.Connection = New OleDb.OleDbConnection
设置连接属性,但是这个新连接没有连接字符串。
cmd.CommandText = CommandType.Text
现在这太愚蠢了。我认为你想要的是cmd.CommandType =CommandType.StoredProcedure
Using...End Using
即使出现错误,块也会负责声明、关闭和处置数据库对象。你不想返回一个DataReader
因为读者需要一个开放的连接。cmd.ExecuteReader
返回一个DataReader
。我用阅读器加载了一个DataTable
并返回了DataTable
.
看来您正在尝试开发工厂模式,但它对您来说太先进了。只需传递值并调用特定于您要搜索的内容的方法即可。你想要你的DataQuery
代码独立于您的用户界面。这Button
代码不关心数据来自哪里。它可以是数据库、文本文件或 Web 服务。同样的DataQuery
代码不知道这些值来自哪里。它可以是 WinForms 应用程序、Web 应用程序或电话应用程序。
Public Class DataQuery
Private Shared ConStr As String = "server=localhost;userid=root;database=employee"
Public Shared Function SearchByLastName(ByVal LName As String) As DataTable
Dim dt As New DataTable
Using cn As New MySqlConnection(ConStr),
cmd As New MySqlCommand("Select * From PutTableNameHere Where LastName = @LName", cn)
cmd.Parameters.Add("@LName", MySqlDbType.VarChar).Value = LName
cn.Open()
Using reader = cmd.ExecuteReader
dt.Load(reader)
End Using
End Using
Return dt
End Function
End Class
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim dt As DataTable = Nothing
If txtbox_lastname.Text <> "" Then
Try
dt = DataQuery.SearchByLastName(txtbox_lastname.Text)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
DataGridView1.DataSource = dt
End Sub