如何使用 vb.net(class、模块和表单)将数据获取到我的数据库

How do i get the data to my database using vb.net (class, module and form)

我希望标题足以理解我的问题,我已经安装了 运行 ADO.NET 需要的东西,我的模块中已经有一个连接字符串,我的 [=] 中已经有一个数据查询23=],

Imports System.Data
Imports System.Data.OleDb
Module GlobalVariables
    Public sGlobalConnectionString As String
    Friend conString As String
    Public dr As OleDbDataReader

    Sub Main()
        Dim sGlobalConnectionString As New OleDb.OleDbConnection
        Dim sDataserver As String
        Dim sDatabaseName As String
        Dim sDatabaseConnection As String

        sDataserver = "localhost"
        sDatabaseName = "employee"
        sDatabaseConnection = "Driver={MariaDB ODBC 3.1 Driver}; SERVER=" & sDataserver & "; UID=root;PWD=******; Database=" & sDatabaseName & "; PORT=3307; OPTION=3"
        sGlobalConnectionString = New OleDb.OleDbConnection(conString)
    End Sub
End Module

这是我的class

Imports System.Data.OleDb

Public Class clsDataQuery
    Public Shared Sub Class_initialize()
        Dim con = New OleDb.OleDbConnection
        con.ConnectionString = sGlobalConnectionString
        con.Open()
    End Sub
    Public Shared Sub Class_Terminate()
        Dim con = New OleDb.OleDbConnection
        If Not con Is Nothing Then
            con.Close()
            con = Nothing
        End If
    End Sub

    Public Function GetRecordDataSet(ByVal sStoreProcName As String, ByVal sParameterList As String)
        Dim cmd As New OleDbCommand()
        Dim arrParameter, arrParamName
        Dim sParamName As String
        Dim sDataValue
        Dim lCtr As Long
        On Error GoTo errhandler

        cmd.Connection = New OleDb.OleDbConnection
        cmd.CommandTimeout = 1800

        cmd.CommandText = CommandType.Text
        If Not Trim(sParameterList) = "" Then
            arrParameter = Split(sParameterList, "|", , vbTextCompare)
            If UBound(arrParameter) >= 0 And IsArray(arrParameter) Then
                For lCtr = 0 To UBound(arrParameter)
                    arrParamName = Split(arrParameter(lCtr), "$", , vbTextCompare)
                    sParamName = arrParamName(0)
                    sDataValue = arrParamName(1)
                    cmd.Parameters.Item(sParamName) = sDataValue
                Next lCtr
            End If
        End If
        GetRecordDataSet = cmd.ExecuteReader
        cmd = Nothing
        Exit Function
errhandler:
        MessageBox.Show("Records Not Found!!!")
    End Function
End Class

如果点击这个按钮,Textbox1.text的值会在数据库中搜索是否存在,如果存在则继续进入另一种形式,如果不存在会出现错误信息,我该怎么做?

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim username = txtbox_lastname.Text
        If username <> "" Then
            Try
                clsDataQuery.Class_initialize()

            Catch ex As Exception
                MessageBox.Show("No Record Found")
            End Try
        Else
            MessageBox.Show("No Record Found!!!")
        End If
    End Sub

在回答之前,我真的认为 GetRecordDataSet() 至少是一个非常好的整理,最好从历史记录中删除

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   Dim username = txtbox_lastname.Text
   If username <> "" Then
      Try
         clsDataQuery.Class_initialize()
        Dim reader = GetRecordDataSet("storedProcName", txtbox_lastName.Text)
        Do While reader.Read()
           'Process record etc
        Loop
      Catch ex As Exception
         MessageBox.Show("No Record Found")
      End Try
   Else
     MessageBox.Show("No Record Found!!!")
   End If
End Sub

可能有点粗糙,但应该让你朝着正确的方向前进

如果这是 MariaDb,那么您想使用 MySql 的提供程序。不是 ODBC 也不是 OleDb。难怪你有问题。与初学者常用的 Access 数据库相比,此数据库的可用信息不多。

除了使用它们的方法之外,不要在任何地方声明数据库对象。您可以在 class 级别为连接字符串声明一个私有变量。

虽然其中一个是模块级变量,一个是局部变量,但这是非常混乱和不好的做法。为什么将连接对象称为字符串?

Public sGlobalConnectionString As String
Dim sGlobalConnectionString As New OleDb.OleDbConnection

顺便说一句,可以在一行中声明和初始化变量。

Dim sDataserver = "localhost"

您在 Sub Main 的第一行创建了一个新连接,然后将其丢弃并在最后一行创建了另一个新连接。由于 sDataServer 和 sDatabaseName 是硬编码的,为什么不直接将文字值直接放入连接字符串中。

毕竟你将 conStr 传递给连接的构造函数而不是 sDatabaseConnection。你为什么要构建 sDatabaseConnection(另一个用词不当,它不是一个连接,它是一个字符串)然后从不使用它。 conStr是否在其他地方设置了?

总之,把整个模块扔掉。

继续 DataQuery class。首先,名称应以大写字母开头。

干掉Class_initialize。我们不想创建或打开任何连接,除非在使用它的方法中。你永远不会打电话给 Class_Terminate 所以也把它转储。

GetRecordDataSet 方法...

vb.net 中的函数需要数据类型。将 return 值分配给函数名称的旧 VB6 语法将起作用,但它不是 .net 方式。在 vb.net 中,我们使用 Return 关键字。

您尚未初始化或指定数据类型 arrParameterarrParamNamesDataValue,这违反了 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 块负责声明、关闭和处置数据库对象,即使出现错误也是如此。您不想 return a DataReader 因为 reader 需要打开连接。 cmd.ExecuteReader return 一个 DataReader。我使用 reader 加载了 DataTable 并 return 编辑了 DataTable.

您似乎正在尝试开发工厂模式,但它对您来说太先进了。只需传递值并调用特定于您要搜索的内容的方法。您希望 DataQuery 代码独立于您的用户界面。 Button 代码不关心数据来自哪里。它可以是数据库、文本文件或 Web 服务。同样,DataQuery 代码不知道这些值来自何处。它可以是 WinForms 应用程序、Web 应用程序或 phone 应用程序。

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