我有一个DataGridView,它包含来自多个数据库的数据。除了三列之外的所有列都是ReadOnly。三个可编辑的列都来自同一个表,这是唯一需要通过DGV编辑的表。
以下是我用来保存DGV中所做更改的更新程序:
Public Sub UpdateScheduleData()
Try
If IgnoreInput Then Exit Sub
Conn = GetConnect()
Conn.Open()
cmdSQL = New SqlCommand("Update Orders_Open Set JobStartDate = @JobStartDate, JobCompleteDate = @JobCompleteDate, LoadDate = @LoadDate, Status = @Status Where OrderID = @OrderID", daSchedule.SelectCommand.Connection)
cmdSQL.Parameters.Add(New SqlParameter("@OrderID", SqlDbType.VarChar))
cmdSQL.Parameters("@OrderID").Value = dgSchedule.Rows(LastEditedRow).Cells("Order ID").Value.ToString
cmdSQL.Parameters.Add(New SqlParameter("@JobStartDate", SqlDbType.VarChar))
If dgSchedule.Rows(LastEditedRow).Cells("Job Start").Value.ToString <> "" Then
cmdSQL.Parameters("@JobStartDate").Value = dgSchedule.Rows(LastEditedRow).Cells("Job Start").Value.ToString
Else
cmdSQL.Parameters("@JobStartDate").Value = DBNull.Value
End If
cmdSQL.Parameters.Add(New SqlParameter("@JobCompleteDate", SqlDbType.VarChar))
If dgSchedule.Rows(LastEditedRow).Cells("Job Complete").Value.ToString <> "" Then
cmdSQL.Parameters("@JobCompleteDate").Value = dgSchedule.Rows(LastEditedRow).Cells("Job Complete").Value.ToString
Else
cmdSQL.Parameters("@JobCompleteDate").Value = DBNull.Value
End If
cmdSQL.Parameters.Add(New SqlParameter("@LoadDate", SqlDbType.VarChar))
If dgSchedule.Rows(LastEditedRow).Cells("Load Date").Value.ToString <> "" Then
cmdSQL.Parameters("@LoadDate").Value = dgSchedule.Rows(LastEditedRow).Cells("Load Date").Value.ToString
Else
cmdSQL.Parameters("@LoadDate").Value = DBNull.Value
End If
daSchedule.UpdateCommand = cmdSQL
daSchedule.Update(dtSchedule)
Conn.Close()
Catch ex As Exception
MessageBox.Show("Error: " & ex.Source & ": " & ex.Message, System.Reflection.MethodInfo.GetCurrentMethod.ToString, MessageBoxButtons.OK)
LogErrors(System.Reflection.MethodInfo.GetCurrentMethod.ToString & " -- " & ex.Message)
End Try
End Sub
我尝试从几个不同的事件中调用此过程,但唯一一个似乎正常工作的是当我单击数据库中的另一行时发生的RowValidated事件。这不是非常用户友好,因为使用通常需要设置日期并立即打印反映这些日期的工作单。必须点击另一个订单然后回到他们尝试使用的订单是不方便的,并且没有必要。
但是,我尝试过的所有其他事件(CellEndEdit,CellValidated,CellLeave等),更新都不会进入数据库。我在daSchedule.Update(dtSchedule)
设置了一个中断,数据表总是反映正确的数据,但数据库中没有任何变化。
对于记录,使用LastEditedRow = dgSchedule.CurrentRow.Index
在CellBeginEdit事件中设置LastEditedRow。我已经多次遍历UpdateScheduleData过程,并且添加到参数的值始终是正确的,没有异常发生,数据库在执行DataAdapter.Update命令时根本无法更新,除非用户单击了另一行
即使数据表显示正确的数据,我做错了什么也阻止了数据库更新?