我有一张从两张桌子上装载汽车和保险细节的表格。看看这个关系:

CarId和insID是自动增量字段。
以下是表单的外观:

很容易说,每辆车每年都有保险,而且它也有一个现行的保险ID。
以下是从数据库加载数据的方式:
sql = "select * from car order by carId"
daCar = New OleDbDataAdapter(sql, oledbConn)
daCar.Fill(dsDataSet, "car")
sql = "select * from carInsurance order by carId"
daInsurance = New OleDbDataAdapter(sql, oledbConn)
daInsurance.Fill(dsDataSet, "insurance")其约束力如下:
bsCar = New BindingSource(dsDataSet, "car")
bsInsurance = New BindingSource(dsDataSet, "insurance")
CarIDTextBox.DataBindings.Add(New Binding("text", bsCar, "carId"))
BrandTextBox.DataBindings.Add(New Binding("text", bsCar, "brand"))
ModelTextBox.DataBindings.Add(New Binding("text", bsCar, "model"))
RegNoTextBox.DataBindings.Add(New Binding("text", bsCar, "regNo"))
InsIDTextBox.DataBindings.Add(New Binding("text", bsCar, "insId"))
.....
InsIDTextBox1.DataBindings.Add(New Binding("text", bsInsurance, "insId"))
CarIDTextBox1.DataBindings.Add(New Binding("text", bsInsurance, "carId"))
InsFromDateDateTimePicker.DataBindings.Add(New Binding("text",bsInsurance, "insFromDate"))
InsToDateDateTimePicker.DataBindings.Add(New Binding("text", bsInsurance, "insToDate"))
...
dgvInsurance.DataSource = bsInsurance ' dsDataSet.Tables("insurance")
bsInsurance.Filter = "carId=" & CarIDTextBox.Text
bsInsurance.Position = bsInsurance.Find("insId", InsIDTextBox.Text)以这种方式增加新车:
bsCar.AddNew()
bsInsurance.AddNew()
bsInsurance.Filter = "carId=0"现在问题是在保存按钮:我的想法是保存新车,并立即获得新的carID,并将carID文本框设置为这个号码的汽车和保险细节。然后保存保险表,从数据库中获取新的insId,并将insId文本框设置为用于汽车和表单保险部分的新insId。最后,用新的insId再次保存汽车表,这使得整个关系都被填满了。这是保存代码:
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
If carMode = "newCar" Then
Try
AddHandler daCar.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf getNewCarID)
AddHandler daInsurance.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf getNewInsID)
Me.Validate()
bsCar.EndEdit()
cbCar = New OleDbCommandBuilder(daCar)
daCar.Update(dsDataSet.Tables("car"))
CarIDTextBox.Text = newCarID
CarIDTextBox1.Text = newCarID
MsgBox("")
bsInsurance.EndEdit()
cbInsurance = New OleDbCommandBuilder(daInsurance)
daInsurance.Update(dsDataSet.Tables("insurance"))
InsIDTextBox.Text = newInsID
InsIDTextBox1.Text = newInsID
MsgBox("")
RemoveHandler daCar.RowUpdated, AddressOf getNewCarID
RemoveHandler daInsurance.RowUpdated, AddressOf getNewInsID
bsCar.EndEdit()
daCar.Update(dsDataSet.Tables("car"))
MsgBox("Car saved successfully")
Catch ex As Exception
MsgBox(Err.Description)
End Try
End If
End Sub
Sub getNewCarID(ByVal sender As Object, ByVal e As OleDb.OleDbRowUpdatedEventArgs)
' Check if we are working for a row with the proper state
If e.Row.RowState = DataRowState.Added Then
Dim cmd = New OleDbCommand("SELECT @@IDENTITY", e.Command.Connection)
newCarID = DirectCast(cmd.ExecuteScalar(), Integer)
End If
End Sub
Sub getNewInsID(ByVal sender As Object, ByVal e As OleDb.OleDbRowUpdatedEventArgs)
' Check if we are working for a row with the proper state
If e.Row.RowState = DataRowState.Added Then
Dim cmd = New OleDbCommand("SELECT @@IDENTITY", e.Command.Connection)
newInsID = DirectCast(cmd.ExecuteScalar(), Integer)
End If
End Sub上述代码不能正常工作。在我打印了一条消息以查看表单的值之后,我发现一些字段值消失了,并且没有按我的意愿设置!解决我的问题的最佳代码序列是什么?
发布于 2014-02-21 08:11:27
这是因为“添加新”按钮中的行bsInsurance.Filter = "carId=0"。因此,当我添加新记录时,一切正常工作,数据被保存到数据库中,但由于过滤器没有设置为新的insId,所以它消失了。所以在保存按钮中添加bsInsurance.Filter = "carId=" & newInsId
https://stackoverflow.com/questions/21890099
复制相似问题