Ситуация в следующем:
Пишу прогу, в которой есть форма типа "Поездка-Участники" в виде Master-Details таблицы, где Details привязаны к DataGrid на форме, а Master - к текстовым полям. Связь с базой данных (Access XP) осуществляется через WebService. Если я создаю новую запись или удаляю запись, то при сохранении изменений в базу все проходит "на ура". Если же пытаюсь изменить данные и произвести их сохранение в базу (Update), вылетает вот такая ошибка:
System.InvalidOperationException: There is an error in XML document (1, 7575).
---> System.NullReferenceException: Object reference not set to an instance of an object.
at System.Xml.Serialization.XmlSerializationReader.UnknownNode(XmlNode unknownNode, Object o)
at System.Xml.Serialization.XmlSerializationReader.UnknownNode(Object o)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read95_UpdateRechnungUndTeilnehmerResponse()
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at ReisebЁ№ro.localhost.DatenService.UpdateRechnungUndTeilnehmer(DataSet ds) in X:\DocSystem\VisualStudio_Projekte\ReisebЁ№ro\Web References\localhost\Reference.vb:line 459
at ReisebЁ№ro.MainForm.UpdateRechnungDataSet() in X:\DocSystem\VisualStudio_Projekte\ReisebЁ№ro\MainForm.vb:line 1689"
Никак не могу разобраться со всем этим .
Привожу пример кода из Web Service'a:
_
Public Function UpdateRechnungUndTeilnehmer(ByVal ds As DataSet) As DataSet
MyOleDbConnection.Open()
Dim tran As OleDbTransaction = MyOleDbConnection.BeginTransaction
Try
UpdateRechnung(ds, MyOleDbConnection, tran)
UpdateTeilnehmer(ds, MyOleDbConnection, tran)
If Not (ds.HasErrors) Then
tran.Commit()
ds.AcceptChanges()
Else
tran.Rollback()
End If
Catch e As Exception
tran.Rollback()
Throw e
Finally
MyOleDbConnection.Close()
End Try
Return ds
End Function
Private Sub UpdateRechnung(ByVal ds As DataSet, _
ByVal con As OleDbConnection, ByVal tran As OleDbTransaction)
Dim insertRechnungSQL As String = "INSERT INTO [Rechnung]" & _
"([Rechnungsdatum], ...) " & _
"VALUES " & _
"(@Rechnungsdatum, ...)"
Dim updateRechnungSQL As String = "UPDATE [Rechnung] SET " & _
"[Rechnungsnummer] = @Rechnungsnummer, [Rechnungsdatum] = @Rechnungsdatum, ... " & _
"WHERE [Rechnungsnummer] = @oldRechnungsnummer"
Dim deleteRechnungSQL As String = "DELETE FROM [Rechnung] WHERE " & _
"[Rechnungsnummer] = @Rechnungsnummer"
Dim cmdRechnung As OleDbDataAdapter = New OleDbDataAdapter( _
"SELECT * FROM Rechnung", con)
cmdRechnung.InsertCommand = New OleDbCommand(insertRechnungSQL, con, tran)
buildRechnungInsertParams(cmdRechnung.InsertCommand)
cmdRechnung.UpdateCommand = New OleDbCommand(updateRechnungSQL, con, tran)
buildRechnungUpdateParams(cmdRechnung.UpdateCommand)
cmdRechnung.DeleteCommand = New OleDbCommand(deleteRechnungSQL, con, tran)
buildRechnungDeleteParams(cmdRechnung.DeleteCommand)
AddHandler cmdRechnung.RowUpdated, New OleDbRowUpdatedEventHandler( _
AddressOf Me.RechnungUndTeilnehmer_RowUpdated)
If Not ds.HasErrors Then
cmdRechnung.Update(ds, "Rechnung") 'Здесь происходит ошибка, если изменения были сделаны в Master-таблице
End If
End Sub
Private Sub UpdateTeilnehmer(ByVal ds As DataSet, ByVal con As OleDbConnection, _
ByVal tran As OleDbTransaction)
Dim insertTeilnehmerSQL As String = "INSERT INTO [Reiseteilnehmer](" & _
"[Rechnungsnummer], ...) " & _
"VALUES (@Rechnungsnummer, ...)"
Dim updateTeilnehmerSQL As String = "UPDATE [Reiseteilnehmer] SET " & _
"[Rechnungsnummer] = @Rechnungsnummer, ... WHERE [ReiseteilnehmerID] = @oldReiseteilnehmerID"
Dim deleteTeilnehmerSQL As String = "DELETE FROM [Reiseteilnehmer] WHERE " & _
"[ReiseteilnehmerID] = @ReiseteilnehmerID"
Dim cmdTeilnehmer As OleDbDataAdapter = New OleDbDataAdapter( _
"SELECT * FROM Reiseteilnehmer", con)
cmdTeilnehmer.InsertCommand = New OleDbCommand(insertTeilnehmerSQL, con, tran)
buildTeilnehmerInsertParams(cmdTeilnehmer.InsertCommand)
cmdTeilnehmer.UpdateCommand = New OleDbCommand(updateTeilnehmerSQL, con, tran)
buildTeilnehmerUpdateParams(cmdTeilnehmer.UpdateCommand)
cmdTeilnehmer.DeleteCommand = New OleDbCommand(deleteTeilnehmerSQL, con, tran)
buildTeilnehmerDeleteParams(cmdTeilnehmer.DeleteCommand)
AddHandler cmdTeilnehmer.RowUpdated, _
New OleDbRowUpdatedEventHandler(AddressOf Me.RechnungUndTeilnehmer_RowUpdated)
If Not ds.HasErrors Then
cmdTeilnehmer.Update(ds, "Reiseteilnehmer") 'Здесь происходит ошибка, если изменения были сделаны в Details-таблице
End If
End Sub
Private Sub RechnungUndTeilnehmer_RowUpdated(ByVal sender As Object, _
ByVal rue As OleDbRowUpdatedEventArgs)
If (rue.Status = UpdateStatus.ErrorsOccurred) Then
rue.Status = UpdateStatus.Continue
rue.Row.RowError = rue.Errors.Message & _
" - BezЁ№glich Fehler sehen Sie bitte WebService fЁ№r Details"
Else
rue.Row.ClearErrors()
End If
End Sub
Private Sub buildRechnungUpdateParams(ByVal workCommand As OleDbCommand)
Dim workParam As OleDbParameter
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@Rechnungsnummer", OleDbType.Integer))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "Rechnungsnummer"
...
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@oldRechnungsnummer", OleDbType.Integer))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "Rechnungsnummer"
workParam.SourceVersion = DataRowVersion.Original
End Sub
Private Sub buildRechnungInsertParams(ByVal workCommand As OleDbCommand)
Dim workParam As OleDbParameter
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@Rechnungsdatum", OleDbType.DBDate))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "Rechnungsdatum"
...
End Sub
Private Sub buildRechnungDeleteParams(ByVal workCommand As OleDbCommand)
Dim workParam As OleDbParameter
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@Rechnungsnummer", OleDbType.Integer))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "Rechnungsnummer"
workParam.SourceVersion = DataRowVersion.Original
End Sub
Private Sub buildTeilnehmerUpdateParams(ByVal workCommand As OleDbCommand)
Dim workParam As OleDbParameter
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@ReiseteilnehmerID", OleDbType.Integer))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "ReiseteilnehmerID"
...
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@oldReiseteilnehmerID", OleDbType.Integer))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "ReiseteilnehmerID"
workParam.SourceVersion = DataRowVersion.Original
End Sub
Private Sub buildTeilnehmerInsertParams(ByVal workCommand As OleDbCommand)
Dim workParam As OleDbParameter
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@Rechnungsnummer", OleDbType.Integer))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "Rechnungsnummer"
...
End Sub
Private Sub buildTeilnehmerDeleteParams(ByVal workCommand As OleDbCommand)
Dim workParam As OleDbParameter
workParam = workCommand.Parameters.Add(New OleDbParameter( _
"@ReiseteilnehmerID", OleDbType.Integer))
workParam.Direction = ParameterDirection.Input
workParam.SourceColumn = "ReiseteilnehmerID"
workParam.SourceVersion = DataRowVersion.Original
End Sub
Извиняюсь заранее за обилие кода, но думаю без этого не разобраться с проблемой. Жду ответа. Спасибо!!!
Последний раз редактировалось 24 March 2004 01:54
|