Как предотвратить вызов параметра DateTime до заполнения столбцов DataGridView? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть DataGridView с 4 столбцами, которые можно динамически добавлять или редактировать с помощью параметров.Все работает до тех пор, пока StartDate (столбец 4) заполнен первым.Когда я заполняю DGV в обычном режиме (слева направо), запрос завершается неудачно и выдает ОШИБКУ «System.FormatException:« Строка не была распознана как допустимый DateTime ».Как можно предотвратить запуск параметра DateTime до завершения строки DataGridView.

Я пытался вставить DBNull в ячейку столбца StartDate до заполнения DGV, но получил хранимую процедуру ERROR 'Too Many arguments'.Я включил код хранимой процедуры в комментарии внизу кода для справки.Заранее спасибо, lejoc

Импортирует System.Data.SqlClient Public Class Form1

Private connectionstring As String = "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Employment;Integrated Security=True;"

Private Sub PopulatePositionComboBox()
    Using sqlCon As SqlConnection = New SqlConnection(connectionstring)
        sqlCon.Open()
        Dim sqlDa As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Position", sqlCon)
        Dim dt As DataTable = New DataTable()
        sqlDa.Fill(dt)
        cbxPositionID.ValueMember = "PositionID"
        cbxPositionID.DisplayMember = "Position"
        Dim topItem As DataRow = dt.NewRow()
        topItem(0) = 0
        topItem(1) = "-Select-"
        dt.Rows.InsertAt(topItem, 0)
        cbxPositionID.DataSource = dt
    End Using
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    PopulatePositionComboBox()
    PopulateDataGridView()
End Sub

Private Sub PopulateDataGridView()
    Using sqlCon As SqlConnection = New SqlConnection(connectionstring)
        sqlCon.Open()
        Dim sqlDa As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Employee", sqlCon)
        Dim dt As DataTable = New DataTable()
        sqlDa.Fill(dt)
        DgvEmployment.DataSource = dt
    End Using
End Sub

Private Sub DgvEmployment_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DgvEmployment.CellValueChanged
    If DgvEmployment.CurrentRow IsNot Nothing Then
        Using sqlCon As SqlConnection = New SqlConnection(connectionstring)
            sqlCon.Open()
            Dim dgvRow As DataGridViewRow = DgvEmployment.CurrentRow
            Dim sqlCmd As SqlCommand = New SqlCommand("AddOrEdit", sqlCon)
            sqlCmd.CommandType = CommandType.StoredProcedure

            ' INSERT
            If dgvRow.Cells("txtEmployeeID").Value Is DBNull.Value Then
                sqlCmd.Parameters.AddWithValue("@EmployeeID", 0)
            Else
                ' UPDATE
                sqlCmd.Parameters.AddWithValue("@EmployeeID", Convert.ToInt32(dgvRow.Cells("txtEmployeeID").Value))
            End If

            ' PROBLEM AT HERE, FAILS Query because looking for VALID DATE after 'txtName' is entered 
            'ERROR MESSAGE = System.FormatException: 'String was not recognized as a valid DateTime.'
            sqlCmd.Parameters.AddWithValue("@Name", If(dgvRow.Cells("txtName").Value Is DBNull.Value, "", dgvRow.Cells("txtName").Value.ToString()))
            sqlCmd.Parameters.AddWithValue("@PositionID", Convert.ToInt32(If(dgvRow.Cells("cbxPositionID").Value Is DBNull.Value, "0", dgvRow.Cells("cbxPositionID").Value)))
            sqlCmd.Parameters.AddWithValue("@Office", If(dgvRow.Cells("txtOffice").Value Is DBNull.Value, "", dgvRow.Cells("txtOffice").Value.ToString()))
            sqlCmd.Parameters.AddWithValue("@StartDate", Convert.ToDateTime(If(dgvRow.Cells("txtStartDate").Value Is DBNull.Value, "0", dgvRow.Cells("txtStartDate").Value)))
            sqlCmd.ExecuteNonQuery()
            PopulateDataGridView()
        End Using
    End If
End Sub


'The code for the STORED PROCEDURE  dbo.AddOrEdit
'    CREATE PROC AddOrEdit
'@EmployeeID int,
'@Name varchar(100),
'@PositionID int,
'@Office varchar(50),
'@StartDate date
'As
'If  @EmployeeID  = 0
'INSERT INTO Employee (Name, PositionID, Office, StartDate)
'VALUES (@Name, @PositionID, @Office, @StartDate)
'Else
'UPDATE Employee
'    Set
'Name = @Name,
'PositionID = @PositionID,
'Office = @Office,
'StartDate = @StartDate
'WHERE EmployeeID = @EmployeeID

Я ожидаю, что DGV будет заполняться слева направо с помощью StartDate в качестве последнего столбца,EG Name, PositionID, Office, StartDate.

1 Ответ

0 голосов
/ 12 июня 2019

Если ваш столбец StartDate обнуляется, то я думаю, что его можно решить, изменив строку

sqlCmd.Parameters.AddWithValue("@StartDate",  Convert.ToDateTime(If(dgvRow.Cells("txtStartDate").Value Is DBNull.Value, "0", dgvRow.Cells("txtStartDate").Value)))

до

sqlCmd.Parameters.AddWithValue("@StartDate", If(dgvRow.Cells("txtStartDate").Value Is DBNull.Value, DBNull.Value, Convert.ToDateTime(dgvRow.Cells("txtStartDate").Value)))

Поэтому, если он не заполнен, сохраните NULL в базе данных, в противном случае преобразуйте поле txtStartDate в DateTime и сохраните его.

Сохранение "0" как DateTime не будет работать.

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