Невозможно вставить значение NULL в столбец intGolferEventYearID, таблица не допускает пустых значений - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть диалог с выпадающим списком, в котором указаны годы проведения мероприятия.Изменяя год, изменяются следующие списки. В одном списке, называемом inEvent, отображаются все игроки в гольф, которые посетили указанное событие.Другое окно со списком, которое называется «доступно», отображает каждого игрока в нашей базе данных, который не посещал событие этого года

. Оно имеет две кнопки.Один удаляет игроков из «inEvent» и перемещает их в «доступные».Эта кнопка работает.Другая кнопка делает противоположное.Он добавляет доступных игроков в гольф к выбранному году проведения.Но это выдает мне ошибку: «Оператор завершен. Невозможно вставить значение NULL в столбец 'intGolferEventYearID', таблица 'dbo.TGolferEventYears'; столбец не допускает нулевые значения. INSERT завершается ошибкой."

Изменение любогоСтрока кода в VB приводит к другой ошибке.Так что я думаю, что ошибка должна исходить от самого SQL, о котором я мало что знаю.Единственное, о чем я могу думать, это о том, что список дает неверную информацию.

Private Sub btnAddAuto_Click(sender As Object, e As EventArgs) Handles btnAddAuto.Click

    Dim strInsert As String = ""
    Dim cmdInsert As OleDb.OleDbCommand ' used for our Select statement
    Dim dt As DataTable = New DataTable ' table we will load from our reader
    Dim intRowsAffected As Integer

    ' open the DB
    OpenDatabaseConnectionSQLServer()

    ' Build the select statement
    strInsert = "INSERT INTO TGolferEventYears ( intGolferID, intEventYearID) Values (" & lstAvailable.SelectedValue & ", " & cboEvents.SelectedIndex + 1 & ")"

    ' Retrieve all the records 
    cmdInsert = New OleDb.OleDbCommand(strInsert, m_conAdministrator)
    intRowsAffected = cmdInsert.ExecuteNonQuery()

    ' close the database connection and reload the form so the changes are shown
    CloseDatabaseConnection()
    frmEventsGolfers_Load(sender, e)
End Sub

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Поскольку я действительно не понимаю SQL, я не осознавал, что на моем ПК не было добавлено тега IDENTITY в таблицу. Добавление этого исправило мою проблему.

Вот код, который я добавил

        Dim strSelect As String
        Dim cmdSelect As OleDb.OleDbCommand            
        Dim drSourceTable As OleDb.OleDbDataReader
        Dim intNextHighestRecordID As 

        strSelect = "SELECT MAX(intDealerAutos) + 1 AS intNextHighestRecordID " &
                        " FROM TDealerAutos"

        'Excute command
        cmdSelect = New OleDb.OleDbCommand(strSelect, m_conAdministrator)
        drSourceTable = cmdSelect.ExecuteReader

        'Read result( highest ID )
        drSourceTable.Read()

        'Null? (Empty Table)
        If drSourceTable.IsDBNull(0) = True Then
            'Yes, start numbering at 1
            intNextHighestRecordID = 1
        Else
            'No, get the next highest ID
            intNextHighestRecordID = CInt(drSourceTable.Item(0))
        End If

        'Build the select statement
        strInsert = "INSERT INTO TDealerAutos ( intDealerAutos, intDealerID, intAutoID)" &
                    "Values (" & intNextHighestRecordID & ", " & cboDealers.SelectedValue & ", " & lstAvailable.SelectedValue & ")"
0 голосов
/ 16 апреля 2019

Я отделил код доступа к данным от пользовательского интерфейса. Это позволит легко полностью исключить доступ к данным из формы, если вы захотите позже.

Private Sub MoveGolfer(GolfID As Integer, YearID As Integer)
    'If you keep your connections local you can be sure they are 
    'closed and disposed which is what the Using...End Using blocks do.
    Using cn As New SqlConnection("Your connection string")
        Using cmd As New SqlCommand("INSERT INTO TGolferEventYears ( intGolferID, intEventYearID) Values (@Golf, @Year;")
            'Always use parameters to protect against Sql injection
            cmd.Parameters.Add("@Golf", SqlDbType.Int).Value = GolfID
            cmd.Parameters.Add("@Year", SqlDbType.Int).Value = YearID
            cn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim GolferID As Integer = CInt(lstAvailable.SelectedValue)
    Dim Year As Integer = cboEvents.SelectedIndex + 1
    Try
        MoveGolfer(GolferID, Year)
    Catch ex As Exception
        'Catch a more specific exception and handle accordingly
        MessageBox.Show(ex.Message)
    End Try
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...