Как использовать VB и SQL для добавления записей в реляционную базу данных в Access - PullRequest
0 голосов
/ 29 марта 2020

Я работаю в Visual Basi c, чтобы создавать приложения для форм в рамках проекта колледжа. Я использовал операторы SQL для чтения из базы данных доступа, но у меня возникли проблемы с записью в нее. Я хотел бы рискнуть предположить, что это связано с базой данных, имеющей отношения между таблицами.

Это мой первый go при создании чего-то существенного, а vb не мой язык выбора. Ожидайте, что код будет плохим в лучшем случае. Если у кого-то есть ссылки на ресурсы, которые я мог бы использовать для улучшения, я был бы безмерно благодарен.

Исключение:

Исключение: 'System.Data.OleDb.OleDbException:' Нет значение задано для одного или нескольких обязательных параметров. '

Местоположение исключения:' commAddToStaff.ExecuteNonQuery () '

Оба оператора try перехватывают исключения при запуске. Я пытался предоставить данные в параметрах, а не использовать данные из текстового поля, но это не решило проблему.

Код:

Private Sub btnAddStaffMember_Click(sender As Object, e As EventArgs) Handles btnAddStaffMember.Click

    'Dimension tblStaff Parameters 
    Dim AddEmployeeIDParam As New OleDb.OleDbParameter("@AddEmployeeID", txtAddEmployeeID.Text)
    Dim AddForenameParam As New OleDb.OleDbParameter("@AddForename", txtAddForename.Text)
    Dim AddSurnameParam As New OleDb.OleDbParameter("@AddSurname", txtAddSurname.Text)
    Dim AddDOBParam As New OleDb.OleDbParameter("@AddDOB", txtAddDOB.Text)
    Dim AddUserTierParam As New OleDb.OleDbParameter("@AddUserTier", txtAddUserTier.Text)

    'Dimension tblContacts Parameters
    Dim conContact As New OleDb.OleDbConnection("Provider=Microsoft.......")
    Dim commContactCount As New OleDb.OleDbCommand("Select Count(*) FROM tblContacts", conContact)
    commContactCount.Connection.Open()                 
    Dim ContactID = commContactCount.ExecuteScalar + 1     'Calculate the contactID of the new record
    commContactCount.Connection.Close()                  'Close the connection
    Dim AddContactIDParam As New OleDb.OleDbParameter("@AddContactID", ContactID)
    Dim AddAddressParam As New OleDb.OleDbParameter("@AddAddress", txtAddAddress.Text)
    Dim AddPostcodeParam As New OleDb.OleDbParameter("@AddPostcode", txtAddPostcode.Text)
    Dim AddEmailParam As New OleDb.OleDbParameter("@AddEmail", txtAddEmail.Text)
    Dim AddMobileNoParam As New OleDb.OleDbParameter("@AddMobileNo", txtAddMobileNumber.Text)

    Dim conAddToStaff As New OleDb.OleDbConnection("Provider=Microsoft....")
    Dim commAddToStaff As New OleDb.OleDbCommand("Insert Into tblStaff (EmployeeID, Forename, Surname, DOB, User_Tier, ContactID) Values (@AddEmployeeID, @AddForename, @AddSurname, @AddDOB, @AddUserTier, @AddContactID)", conAddToStaff)
    commAddToStaff.Parameters.Add(AddEmployeeIDParam)
    commAddToStaff.Parameters.Add(AddForenameParam)
    commAddToStaff.Parameters.Add(AddSurnameParam)
    commAddToStaff.Parameters.Add(AddDOBParam)
    commAddToStaff.Parameters.Add(AddUserTierParam)

    Dim commAddToContact As New OleDb.OleDbCommand("Insert Into tblContacts (ContactID, Address, Postcode, Email, Mobile_Number) Values (@AddContactID, @AddAddress, @AddPostcode, @AddEmail, @AddMobileNo)", conContact)
    commAddToContact.Parameters.Add(AddContactIDParam)
    commAddToContact.Parameters.Add(AddAddressParam)
    commAddToContact.Parameters.Add(AddPostcodeParam)
    commAddToContact.Parameters.Add(AddEmailParam)
    commAddToContact.Parameters.Add(AddMobileNoParam)

    Try
        commAddToStaff.Connection.Open()                 'Open a connection to the database
        commAddToStaff.ExecuteNonQuery()                 'Execute the command
        commAddToStaff.Connection.Dispose()              'Remove unmanaged resources
        commAddToStaff.Connection.Close()                'Close the connection
    Catch ex As Exception
        MessageBox.Show("Error with staff")
    End Try

    Try
        commAddToContact.Connection.Open()                 'Open a connection to the database
        commAddToContact.ExecuteNonQuery()                 'Execute the command
        commAddToContact.Connection.Dispose()              'Remove unmanaged resources
        commAddToContact.Connection.Close()                'Close the connection
    Catch ex As Exception
        MessageBox.Show("Error with contacts")
    End Try

    MessageBox.Show("Reached")

    Me.Hide()       'Close the Current screen
    StaffDB_Add_Staff_Security_Question.Show()  'Open the Add Security Question Screen
End Sub

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Здесь вы вставляете шесть значений в шесть столбцов:

Dim commAddToStaff As New OleDb.OleDbCommand("Insert Into tblStaff (EmployeeID, Forename, Surname, DOB, User_Tier, ContactID) Values (@AddEmployeeID, @AddForename, @AddSurname, @AddDOB, @AddUserTier, @AddContactID)", conAddToStaff)

, но здесь вы добавляете в команду только пять параметров:

commAddToStaff.Parameters.Add(AddEmployeeIDParam)
commAddToStaff.Parameters.Add(AddForenameParam)
commAddToStaff.Parameters.Add(AddSurnameParam)
commAddToStaff.Parameters.Add(AddDOBParam)
commAddToStaff.Parameters.Add(AddUserTierParam)

Где находится параметр для @AddContactID заполнитель в SQL коде?

РЕДАКТИРОВАТЬ:

Для справки, вот как я хотел бы написать код для такого рода задач, игнорируя ужасный способ генерации ContactID значение:

Using connection As New OleDbConnection("connection string here")
    connection.Open()

    Dim contactCount As Integer

    Using contactCountCommand As New OleDbCommand("SELECT COUNT(*) FROM tblContacts", connection)
        contactCount = CInt(contactCountCommand.ExecuteScalar())
    End Using

    Dim contactId = contactCount + 1

    Using staffCommand As New OleDbCommand("INSERT INTO tblStaff (EmployeeID, Forename, Surname, DOB, User_Tier, ContactID) Values (@EmployeeID, @Forename, @Surname, @DOB, @User_Tier, @ContactID)", connection)
        With staffCommand.Parameters
            .Add("@EmployeeID", OleDbType.VarChar, 50).Value = txtAddEmployeeID.Text
            .Add("@Forename", OleDbType.VarChar, 50).Value = txtAddForename.Text
            .Add("@Surname", OleDbType.VarChar, 50).Value = txtAddSurname.Text
            .Add("@DOB", OleDbType.Date).Value = CDate(txtAddDOB.Text) 'Why isn't this coming from a DateTimePicker?
            .Add("@User_Tier", OleDbType.VarChar, 50).Value = txtAddUserTier.Text
            .Add("@ContactID", OleDbType.Integer).Value = contactId
        End With

        staffCommand.ExecuteNonQuery()
    End Using

    Using contactCommand As New OleDbCommand("INSERT INTO tblContacts (ContactID, Address, Postcode, Email, Mobile_Number) Values (@ContactID, @Address, @Postcode, @Email, @Mobile_Number)", connection)
        With contactCommand.Parameters
            .Add("@ContactID", OleDbType.Integer).Value = contactId
            .Add("@Address", OleDbType.VarChar, 50).Value = txtAddAddress.Text
            .Add("@Postcode", OleDbType.VarChar, 50).Value = txtAddPostcode.Text
            .Add("@Email", OleDbType.VarChar, 50).Value = txtAddEmail.Text
            .Add("@Mobile_Number", OleDbType.VarChar, 50).Value = txtAddMobileNumber.Text
        End With

        contactCommand.ExecuteNonQuery()
    End Using
End Using
0 голосов
/ 29 марта 2020

Было бы проще увидеть, где недостаточно добавленных параметров, переставив код на более мелкие части, где связанные элементы расположены рядом друг с другом. Что-то вроде:

Imports System.Data.OleDb

Public Class Form1

    Dim connStr As String = "Provider=Microsoft......."

    Sub AddStaffMemberToDatabase(contactId As Integer)
        Dim sql = "INSERT INTO tblStaff (EmployeeID, Forename, Surname, DOB, UserTier, ContactID) VALUES (@AddEmployeeID, @AddForename, @AddSurname, @AddDOB, @AddUserTier, @AddContactID)"

        Using conn As New OleDbConnection(connStr),
                cmd As New OleDbCommand(sql, conn)

            Dim dob = DateTime.Parse(txtAddDOB.Text)

            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddEmployeeID", .OleDbType = OleDbType.VarChar, .Size = 20, .Value = txtAddEmployeeID.Text})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddForename", .OleDbType = OleDbType.VarWChar, .Size = 255, .Value = txtAddForename.Text})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddSurname", .OleDbType = OleDbType.VarWChar, .Size = 255, .Value = txtAddSurname.Text})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddDOB", .OleDbType = OleDbType.Date, .Value = dob})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddUserTier", .OleDbType = OleDbType.VarChar, .Size = 20, .Value = txtAddUserTier.Text})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddContactID", .OleDbType = OleDbType.Integer, .Value = contactId})

            conn.Open()
            cmd.ExecuteNonQuery()

        End Using

    End Sub

    Sub AddContactToDatabase(contactId As Integer)
        Dim sql = "INSERT INTO tblContacts (ContactID, Address, Postcode, Email, Mobile_Number) VALUES (@AddContactID, @AddAddress, @AddPostcode, @AddEmail, @AddMobileNo)"

        Using conn As New OleDbConnection(connStr),
                cmd As New OleDbCommand(sql, conn)

            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddContactID", .OleDbType = OleDbType.Integer, .Value = contactId})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddAddress", .OleDbType = OleDbType.VarWChar, .Size = 255, .Value = txtAddAddress.Text})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@txtAddPostcode", .OleDbType = OleDbType.VarChar, .Size = 20, .Value = txtAddPostcode.Text})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddEmail", .OleDbType = OleDbType.VarWChar, .Size = 255, .Value = txtAddEmail.Text})
            cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@AddMobileNo", .OleDbType = OleDbType.VarChar, .Size = 20, .Value = txtAddMobileNumber.Text})

            conn.Open()
            cmd.ExecuteNonQuery()

        End Using

    End Sub

    Sub AddStaffMember()
        Dim sql = "SELECT COUNT(*) FROM tblContacts"
        Dim contactID As Integer

        Using conn As New OleDbConnection(connStr),
                cmd As New OleDbCommand(sql, conn)
            conn.Open()
            contactID = Convert.ToInt32(cmd.ExecuteScalar()) + 1
        End Using

        AddStaffMemberToDatabase(contactID)
        AddContactToDatabase(contactID)

    End Sub

    Private Sub btnAddStaffMember_Click(sender As Object, e As EventArgs) Handles btnAddStaffMember.Click
        AddStaffMember()
        Me.Hide()
        StaffDB_Add_Staff_Security_Question.Show()  'Open the Add Security Question Screen

    End Sub

End Class

Оператор Using гарантирует, что «неуправляемые ресурсы» будут освобождены после завершения кода с ними.

Обратите внимание, что вы будете необходимо предоставить более конкретный c и надежный способ анализа текста DOB (например, DateTime.TryParseExact). Кроме того, типы и размеры базы данных необходимо редактировать так, чтобы они соответствовали объявлениям в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...