如何使用 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
关键字。
您尚未初始化或指定数据类型 arrParameter
、arrParamName
或 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
块负责声明、关闭和处置数据库对象,即使出现错误也是如此。您不想 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
我希望标题足以理解我的问题,我已经安装了 运行 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
关键字。
您尚未初始化或指定数据类型 arrParameter
、arrParamName
或 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
块负责声明、关闭和处置数据库对象,即使出现错误也是如此。您不想 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