我如何得到数据到我的数据库使用vb.net(类,模块和形式)



我希望标题足以理解我的问题,我已经安装了什么需要运行ADO。. NET,我已经有一个连接字符串在我的模块和数据查询在我的类,

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

这是我的类

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的值。文本将在数据库中搜索,如果它存在,如果存在,它将继续到另一种形式,如果没有错误信息会出现,我怎么做?

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

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

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

虽然其中一个是模块级变量,另一个是局部变量,但这是非常令人困惑的,也是不好的做法。为什么要将连接对象称为String?

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,所以把它也转储了。

GetRecordDataSet方法…

vb.net中的函数需要一个数据类型。将返回值赋给函数名的旧VB6语法可以工作,但它不是。net的方式。在vb.net中我们使用Return关键字。

您没有初始化或给arrParameter,arrParamNamesDataValue数据类型,这违反了选项严格。(你有选项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

在回答之前,我真的认为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

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

最新更新