好的,所以基本上我想要完成的是获取 MAX ID + 1 并将其显示在文本框中,让用户输入名字和姓氏,并应将其插入数据库。目前,我正在实施 DataAccess.vbDim da As DataAccess以便在 CustomerForm.vb 中使用。编辑客户工作正常,数据正在填充框中并成功。但是,当添加客户时,它在尝试获取最大 Id + 1 时未填写该框。调试时出现错误:
System.InvalidOperationException:“ExecuteReader:连接属性尚未初始化。”
我确实尝试在线查找以解决此问题,但是并提到 SqlCommand 不正确。我在在线 DataAccess.vb 上收到此错误objDataTable.Load(objSqlCommand.ExecuteReader())。还要注意,如果 editMode 是 true 或 false,它们都会打开 CustomerForm.vb
数据访问.vb
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Data.OleDb
Imports System.Configuration
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Collections
Public Class DataAccess
Private connectionString As String
Private objConnection As SqlConnection
Public objSqlCommand As SqlCommand = New SqlCommand()
Private commandText As String
Public objDataTable As DataTable = New DataTable()
Public ReadOnly Property Connection As SqlConnection
Get
Return Me.objConnection
End Get
End Property
Public Sub New()
connectionString = ("server=CASHAMERICA; Trusted_Connection=yes; database=ProductsDatabase2; connection timeout=30")
End Sub
Public Sub OpenDBConnection()
objConnection = New SqlConnection(connectionString)
objConnection.Open()
End Sub
Public Sub Parameters(ByVal name As String, ByVal val As Decimal)
objSqlCommand.Parameters.AddWithValue(name, val)
End Sub
Public Sub Parameters(ByVal name As String, ByVal val As String)
objSqlCommand.Parameters.AddWithValue(name, val)
End Sub
Public Sub Parameters(ByVal name As String, ByVal val As Boolean)
objSqlCommand.Parameters.AddWithValue(name, val)
End Sub
Public Sub CreateCommandObject()
objSqlCommand = objConnection.CreateCommand()
objSqlCommand.CommandText = commandText
objSqlCommand.CommandType = CommandType.Text
End Sub
Public Function FillDataTable() As DataTable
objDataTable = New DataTable()
objSqlCommand.CommandText = commandText
objSqlCommand.Connection = objConnection
objSqlCommand.CommandType = CommandType.Text
objDataTable.Load(objSqlCommand.ExecuteReader()) //issue here
objConnection.Close()
Return objDataTable
End Function
Public Sub CloseConnection()
If objConnection IsNot Nothing Then objConnection.Close()
End Sub
End Class
客户窗体.vb
Imports System.Data.SqlClient
Public Class CustomerForm
Private objConnection As SqlConnection
Dim da As DataAccess = New DataAccess()
Public objDataTable As DataTable = New DataTable()
Public objSqlCommand As SqlCommand = New SqlCommand()
Public editMode As Boolean = False
Public id As String = ""
Public FName As String = ""
Public LName As String = ""
Public PhNumber As String = ""
Public ReadOnly Property Connection As SqlConnection
Get
Return Me.objConnection
End Get
End Property
Dim CS As String = ("server=CASHAMERICA;Trusted_Connection=yes;database=ProductsDatabase2; connection timeout=30")
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Try
If editMode = False Then
If txtFirstName.Text = "" Then
MessageBox.Show("First Name Is required")
ElseIf txtLastName.Text = "" Then
MessageBox.Show("Last Name Is required")
Else
Dim con As New SqlConnection(CS)
con.Open()
Dim cmd As New SqlCommand("INSERT INTO Customers(FIrstName,LastName,PhoneNumber) VALUES(@FName, @LName, @PhNumber)", con)
cmd.Parameters.AddWithValue("@FName", txtFirstName.Text)
cmd.Parameters.AddWithValue("@LName", txtLastName.Text)
cmd.Parameters.AddWithValue("@PhNumber", txtPhoneNumber.Text)
cmd.ExecuteNonQuery()
MessageBox.Show("Customer has been added!")
con.Close()
End If
ElseIf editMode = True Then
If txtFirstName.Text = "" Then
MessageBox.Show("First Name Is required")
ElseIf txtLastName.Text = "" Then
MessageBox.Show("Last Name Is required")
Else
Dim con As New SqlConnection(CS)
con.Open()
Dim cmd As New SqlCommand("UPDATE Customers SET FIrstName = @FName, LastName = @LName, PhoneNumber = @PhNumber WHERE Id = @Id", con)
cmd.Parameters.AddWithValue("@Id", id)
cmd.Parameters.AddWithValue("@FName", txtFirstName.Text)
cmd.Parameters.AddWithValue("@LName", txtLastName.Text)
cmd.Parameters.AddWithValue("@PhNumber", txtPhoneNumber.Text)
cmd.ExecuteNonQuery()
MessageBox.Show("Customer has been edited.")
con.Close()
End If
End If
Catch ex As Exception
MessageBox.Show(Me, ex.Message, "Save Failed", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
Me.Close()
End Sub
Private Sub CustomerForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
If editMode = False Then
GetId()
Else
textId.Text = id
txtFirstName.Text = FName
txtLastName.Text = LName
txtPhoneNumber.Text = PhNumber
End If
End Sub
Private Sub GetId()
Dim cmd As New SqlCommand("SELECT MAX(id)+1 FROM Customers")
da.OpenDBConnection()
da.CreateCommandObject()
textId.Text = da.FillDataTable().Rows(0)(0).ToString()
If textId.Text = "" Then
textId.Text = "1"
End If
End Sub
End Class