0

好的,所以基本上我想要完成的是获取 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
4

0 回答 0