none
Fehlermeldung nach Update - Aktualisieren erfordert einen gültigen UpdateCommand RRS feed

  • 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" />
                    &nbsp;<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!
    Sonntag, 6. Dezember 2009 12:05

Antworten

  • Hallo Luzie,
    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."
    wo ist denn dein UpdateCommand? Ich seh da keins. Was ist "Adapter"? Ein Objekt? Wie sieht der Code für Delete aus?


    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
    Montag, 14. Dezember 2009 10:11
    Moderator
  • 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!
    Freitag, 18. Dezember 2009 23:12

Alle Antworten

  • Hallo Luzie,
    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."
    wo ist denn dein UpdateCommand? Ich seh da keins. Was ist "Adapter"? Ein Objekt? Wie sieht der Code für Delete aus?


    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
    Montag, 14. Dezember 2009 10:11
    Moderator
  • 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!
    Freitag, 18. Dezember 2009 23:12