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

霸气de小男生 提交于 2021-02-17 06:43:06

问题


I hope the title is enough to understand my problem, I already installed whats need to run the ADO.NET, I already have a connection string in my module and data query in my class,

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

this is my 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

if this button is click, the value of Textbox1.text will search in the database if it is exist, if exist it will continue into another form if not error message will appear, how do i do that?

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

回答1:


If this is MariaDb then you want to use the provider for MySql. Not ODBC and not OleDb. No wonder you are having problems. There is not much information available for this database compared to the usual Access database used for beginners.

Do not declare database objects anywhere but the method they are used in. You can declare a Private variable for the connection string at the class level.

Although one of these is a Module level variable and one is a local variable, it is very confusing and bad practice. Why would you call a connection object a String?

Public sGlobalConnectionString As String
Dim sGlobalConnectionString As New OleDb.OleDbConnection

BTW, it is fine to declare and initialize your variables in a single line.

Dim sDataserver = "localhost"

You create a new connection on the first line of Sub Main, then you throw it away and create another new connection on the last line. Since sDataServer and sDatabaseName are hard coded why not just put the literal values directly into the connection string.

After all that you pass conStr to the constructor of the connection instead of sDatabaseConnection. Why were you building sDatabaseConnection (another misnomer, it is not a connection, its a string) and then never use it. Has conStr been set elsewhere?

At any rate, throw out the whole module.

Moving on to your DataQuery class. First, the name should begin with an upper case letter.

Get rid of Class_initialize. We don't want to create or open any connection except in the method where it is used. You never call Class_Terminate so dump that too.

The GetRecordDataSet method...

Functions in vb.net require a datatype. The old VB6 syntax of assigning the return value to the name of the function will work but it is not the .net way. In vb.net we use the Return keyword.

You have not initialized or given a datatype to arrParameter, arrParamName or sDataValue which violates Option Strict. (You do have Option Strict On, don't you?)

On Error GoTo errhandler is a sad leftover from VB6. .net languages have structured error handling with Try...Catch...Finally...End Try.

cmd.Connection = New OleDb.OleDbConnection sets the connection property however this new connection has no connection string.

cmd.CommandText = CommandType.Text Now this is just silly. What I think you want is cmd.CommandType =CommandType.StoredProcedure

Using...End Using blocks take care of declaring, closing and disposing database objects even if there is an error. You don't want to return a DataReader because a reader requires an open connection. cmd.ExecuteReader returns a DataReader. I used the reader to load a DataTable and returned the DataTable.

It seems you are trying to develop a factory pattern but it is way too advanced for your. Just pass value and call a method specific to what your are searching for. You want your DataQuery code to be independent from your user interface. The Button code doesn't care where the data is coming from. It could be a database, a text file, or a web service. Likewise the DataQuery code doesn't know where the values are coming from. It could be a WinForms app, a web application or a phone app.

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



回答2:


Before answering, I really think that the GetRecordDataSet() at the very least a darn good tidy up, better yet removed from history

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

Might be a bit rough, but should get you heading in the right direction



来源:https://stackoverflow.com/questions/66043400/how-do-i-get-the-data-to-my-database-using-vb-net-class-module-and-form

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!