Benutzer mit den meisten Antworten
Fehlermeldung nach Update - Aktualisieren erfordert einen gültigen UpdateCommand

Frage
-
Hallo
Ich bekomme beim Update eines Datensatzes immer folgende Fehlermeldung und kann den Fehler aber nicht finden.
"Aktualisieren erfordert einen gültigen UpdateCommand, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird."
Ich habe eine DetailBLL.vb, mit u.a. folgender Funktion
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, False)> _ Public Function GetDetailByID(ByVal id As Integer) As detail.detailDataTable Return Adapter.GetDetailByID(id) End Function <System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, True)> _ Public Function UpdateDetail(ByVal id As Integer, _ ByVal detailText As String) As Boolean Dim details As detail.detailDataTable = Adapter.GetDetailByID(id) If details.Count = 0 Then Return False End If Dim detail As detail.detailRow = details(0) detail.detailtext = detailText Dim rowsAffected As Integer = Adapter.Update(details) Return rowsAffected = 1 End Function
GetDetailByID(id) existiert als Select command in eine Dataset-Datei detail.xsd
Ich habe ein Objekt-Datasource erzeugt
<asp:ObjectDataSource ID="odsDetail"
runat="server"
DeleteMethod="DeleteDetail"
InsertMethod="AddDetail"
SelectMethod="GetDetail"
UpdateMethod="UpdateDetail"
TypeName="detailBLL"
MaximumRowsParameterName="10">
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="id" Type="Int32" />
<asp:Parameter Name="detailText" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="detailtext" Type="String" />
</InsertParameters>
</asp:ObjectDataSource>
und ein Formview
<asp:FormView ID="FormView1" runat="server" CellPadding="4"
DataKeyNames="id"
DataSourceID="odsDetail" ForeColor="#333333">
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
<EditItemTemplate>
id:
<asp:Label ID="idLabel1" runat="server" Text='<%# Eval("id") %>' />
<br />
detailtext:
<asp:TextBox ID="detailtextTextBox" runat="server"
Text='<%# Bind("detailtext") %>' />
<br />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
CommandName="Update" Text="Aktualisieren" />
<asp:LinkButton ID="UpdateCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="Abbrechen" />
</EditItemTemplate>
Wo ist nun der Fehler?
Insert, Select, Delete funktioniert alles.
Ich habe mir das Beispiel aus dem Learn-Bereich von ASP.net heruntergeladen.
Die Datenbanktabelle heißt detail und hat nur 2 Spalten (id int, detailText (varchar(50))
Ich wüsste gerne, was ich falsch gemacht habe.
Liebe Grüße, die Luzie!
Antworten
-
Hallo Luzie,
Ich bekomme beim Update eines Datensatzes immer folgende Fehlermeldung und kann den Fehler aber nicht finden.
wo ist denn dein UpdateCommand? Ich seh da keins. Was ist "Adapter"? Ein Objekt? Wie sieht der Code für Delete aus?
"Aktualisieren erfordert einen gültigen UpdateCommand, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird."
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 25. März 2010 13:44
-
Hallo
ich teste zur Zeit die unterschiedlichsten Wege, mit ASP.NET Daten zu verarbeiten. D.h., über ADO.net über ein Gridview mit unterschiedlichen Datasources. Was halt für mich am besten ist. Zu diesem Zweck habe ich mir die Beispiel-Applikation heruntergeladen http://www.asp.net/learn/data-access/tutorial-51-vb.aspx, um einfach zu schauen, wie andere es machen. Ich bin halt Anfänger und habe wirklich keine Erfahrung. Ich habe ein Beispiel mal 1 zu 1 für eine Tabelle von mir übernommen. Die Datasets liegen in einer xsd Datei. Aber da ist auch kein UpdateCommand vorhanden.
Im Scirpt selbst wird ja Datatable Adapter.GetDetailByID(id), (ein Selectstatement mit Parameter ID) aufgerufen und unten mit einem Update ausgeführt. In Classik ASP kann man ja auch Datensätze über ein Recordset via Addnew einfügen oder mit update ändern. Ich bin einfach davon ausgegangen, dass es eine ähnliche Methode ist, ohne SQL-Update-Statement.
Das Thema hat sich allerdings erledigt, da ich den Fehler selbst nicht orten konnte, kommt für mich diese Methode der Datenverarbeitung nicht in Frage.
Aber trotzdem danke für die Antwort.
Hier das komplette Scirpt der Klasse.
Imports detailTableAdapters
<System.ComponentModel.DataObject()> _
Public Class detailBLL
Private _detailAdapter As detailTableAdapter = Nothing
Protected ReadOnly Property Adapter() As detailTableAdapter
Get
If _detailAdapter Is Nothing Then
_detailAdapter = New detailTableAdapter()
End If
Return _detailAdapter
End Get
End Property
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, True)> _
Public Function GetDetail() As detail.detailDataTable
Return Adapter.GetDetail
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetDetailByID(ByVal id As Integer) As detail.detailDataTable
Return Adapter.GetDetailByID(id)
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateDetail(ByVal id As Integer, _
ByVal detailText As String) As Boolean
Dim details As detail.detailDataTable = Adapter.GetDetailByID(id)
If details.Count = 0 Then
Return False
End If
Dim detail As detail.detailRow = details(0)
detail.detailtext = detailText
Dim rowsAffected As Integer = Adapter.Update(details)
Return rowsAffected = 1
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateDetail1(ByVal id As Integer, _
ByVal detailText As String) As Boolean
Dim details As detail.detailDataTable = Adapter.GetDetailByID(id)
If details.Count = 0 Then
' no matching record found, return false
Return False
End If
Dim detail As detail.detailRow = details(0)
' Business rule check - cannot discontinue a product that's supplied by only
' one supplier
detail.detailtext = detailText
' Update the product record
Dim rowsAffected As Integer = Adapter.Update(details)
' Return true if precisely one row was updated, otherwise false
Return rowsAffected = 1
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, True)> _
Public Function AddDetail(ByVal detailtext As String) As Boolean
' Create a new ProductRow instance
Dim details As New detail.detailDataTable
Dim detail As detail.detailRow = details.NewdetailRow
detail.detailtext = detailtext
' Add the new product
details.AdddetailRow(detail)
Dim rowsAffected As Integer = Adapter.Update(details)
' Return true if precisely one row was inserted, otherwise false
Return rowsAffected = 1
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, True)> _
Public Function DeleteDetail(ByVal id As Integer) As Boolean
Dim rowsAffected As Integer = Adapter.deleteDetail(id)
' Return true if precisely one row was deleted, otherwise false
Return rowsAffected = 1
End Function
End Class
Liebe Grüße, die Luzie!- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 25. März 2010 13:44
Alle Antworten
-
Hallo Luzie,
Ich bekomme beim Update eines Datensatzes immer folgende Fehlermeldung und kann den Fehler aber nicht finden.
wo ist denn dein UpdateCommand? Ich seh da keins. Was ist "Adapter"? Ein Objekt? Wie sieht der Code für Delete aus?
"Aktualisieren erfordert einen gültigen UpdateCommand, wenn eine DataRow-Auflistung mit modifizierten Zeilen weitergegeben wird."
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 25. März 2010 13:44
-
Hallo
ich teste zur Zeit die unterschiedlichsten Wege, mit ASP.NET Daten zu verarbeiten. D.h., über ADO.net über ein Gridview mit unterschiedlichen Datasources. Was halt für mich am besten ist. Zu diesem Zweck habe ich mir die Beispiel-Applikation heruntergeladen http://www.asp.net/learn/data-access/tutorial-51-vb.aspx, um einfach zu schauen, wie andere es machen. Ich bin halt Anfänger und habe wirklich keine Erfahrung. Ich habe ein Beispiel mal 1 zu 1 für eine Tabelle von mir übernommen. Die Datasets liegen in einer xsd Datei. Aber da ist auch kein UpdateCommand vorhanden.
Im Scirpt selbst wird ja Datatable Adapter.GetDetailByID(id), (ein Selectstatement mit Parameter ID) aufgerufen und unten mit einem Update ausgeführt. In Classik ASP kann man ja auch Datensätze über ein Recordset via Addnew einfügen oder mit update ändern. Ich bin einfach davon ausgegangen, dass es eine ähnliche Methode ist, ohne SQL-Update-Statement.
Das Thema hat sich allerdings erledigt, da ich den Fehler selbst nicht orten konnte, kommt für mich diese Methode der Datenverarbeitung nicht in Frage.
Aber trotzdem danke für die Antwort.
Hier das komplette Scirpt der Klasse.
Imports detailTableAdapters
<System.ComponentModel.DataObject()> _
Public Class detailBLL
Private _detailAdapter As detailTableAdapter = Nothing
Protected ReadOnly Property Adapter() As detailTableAdapter
Get
If _detailAdapter Is Nothing Then
_detailAdapter = New detailTableAdapter()
End If
Return _detailAdapter
End Get
End Property
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, True)> _
Public Function GetDetail() As detail.detailDataTable
Return Adapter.GetDetail
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetDetailByID(ByVal id As Integer) As detail.detailDataTable
Return Adapter.GetDetailByID(id)
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateDetail(ByVal id As Integer, _
ByVal detailText As String) As Boolean
Dim details As detail.detailDataTable = Adapter.GetDetailByID(id)
If details.Count = 0 Then
Return False
End If
Dim detail As detail.detailRow = details(0)
detail.detailtext = detailText
Dim rowsAffected As Integer = Adapter.Update(details)
Return rowsAffected = 1
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateDetail1(ByVal id As Integer, _
ByVal detailText As String) As Boolean
Dim details As detail.detailDataTable = Adapter.GetDetailByID(id)
If details.Count = 0 Then
' no matching record found, return false
Return False
End If
Dim detail As detail.detailRow = details(0)
' Business rule check - cannot discontinue a product that's supplied by only
' one supplier
detail.detailtext = detailText
' Update the product record
Dim rowsAffected As Integer = Adapter.Update(details)
' Return true if precisely one row was updated, otherwise false
Return rowsAffected = 1
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, True)> _
Public Function AddDetail(ByVal detailtext As String) As Boolean
' Create a new ProductRow instance
Dim details As New detail.detailDataTable
Dim detail As detail.detailRow = details.NewdetailRow
detail.detailtext = detailtext
' Add the new product
details.AdddetailRow(detail)
Dim rowsAffected As Integer = Adapter.Update(details)
' Return true if precisely one row was inserted, otherwise false
Return rowsAffected = 1
End Function
<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, True)> _
Public Function DeleteDetail(ByVal id As Integer) As Boolean
Dim rowsAffected As Integer = Adapter.deleteDetail(id)
' Return true if precisely one row was deleted, otherwise false
Return rowsAffected = 1
End Function
End Class
Liebe Grüße, die Luzie!- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 25. März 2010 13:44