2009-08-05 9 views
0

Das ist ein String, der von .net zurückgegeben wird, wenn ein Gridview-Steuerelement verwendet wird, das an eine ObjectDataSource gebunden ist. Die ObjectDataSource ist an einen TableAdapter in einem .net DataSet gebunden.konnte eine nicht generische Methode 'Delete' mit Parametern nicht finden

Das Dataset verfügt über einen Tabellenadapter, der automatisch generiert wird und ein aktualisiertes, eingefügtes, ausgewähltes und gelöschtes Proc in meiner Datenbank erstellt hat.

Das Grid verwendet jetzt diese Quelle und sollte Einfügen, Aktualisieren und Löschen zulassen.

Einfügen und Updates funktionieren, aber das Löschen gibt speziell den Fehler

Object ‚odsCustomerAliases‘ konnte keine nicht-generische Methode ‚Löschen‘ finden, die Parameter: CustomerAlias, original_CustomerAlias.

Während ich den Fehler lesen kann habe ich eine Reihe von Dingen ausprobiert und kann dies nicht funktionieren. Ich kann nicht wirklich sehen, wie es einen Parameter 'original_CustomerAlias' erwartet

Ich kann bestätigen, dass dieser Parameter nicht in der Proc existiert.

Hier sind einige Code-Schnipsel, die korrekt zu sein scheinen.

<asp:ObjectDataSource ID="odsCustomerAliases" runat="server" DeleteMethod="Delete" 
       InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" SelectMethod="GetData" 
       TypeName="SLRDataAccess.dsTableAdapters.CustomerAliasesTableAdapter" UpdateMethod="Update"> 
       <DeleteParameters> 
        <asp:Parameter Name="CustomerAlias" Type="String" /> 
       </DeleteParameters> 
       <UpdateParameters> 
        <asp:Parameter Name="original_CustomerAlias" Type="String" /> 
        <asp:Parameter Name="CustomerAlias" Type="String" /> 
       </UpdateParameters> 
       <SelectParameters> 
        <asp:SessionParameter Name="CustomerID" SessionField="CustomerID" Type="Int32" /> 
       </SelectParameters> 
       <InsertParameters> 
        <asp:Parameter Name="CustomerAlias" Type="String" /> 
        <asp:Parameter Name="CustomerID" Type="Int32" /> 
       </InsertParameters> 
      </asp:ObjectDataSource> 

Der Abschnitt aus dem automatisch generierten Dataset.

<DeleteCommand> 
       <DbCommand CommandType="StoredProcedure" ModifiedByUser="False"> 
       <CommandText>dbo.usp_DeleteCustomerAlias</CommandText> 
       <Parameters> 
        <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="ReturnValue" ParameterName="@RETURN_VALUE" Precision="10" ProviderType="Int" Scale="0" Size="4" SourceColumnNullMapping="False" SourceVersion="Current"> 
        </Parameter> 
        <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@CustomerAlias" Precision="0" ProviderType="VarChar" Scale="0" Size="100" SourceColumn="CustomerAlias" SourceColumnNullMapping="False" SourceVersion="Current"> 
        </Parameter> 
       </Parameters> 
       </DbCommand> 
      </DeleteCommand> 

Der letzte Code-Schnipsel aus dem Designer, die ich mir vorstellen, ist nicht wirklich relevant, aber ...

<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ 
    Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _ 
    Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Delete, true)> _ 
    Public Overloads Overridable Function Delete(ByVal CustomerAlias As String) As Integer 
     If (CustomerAlias Is Nothing) Then 
      Me.Adapter.DeleteCommand.Parameters(1).Value = Global.System.DBNull.Value 
     Else 
      Me.Adapter.DeleteCommand.Parameters(1).Value = CType(CustomerAlias,String) 
     End If 
     Dim previousConnectionState As Global.System.Data.ConnectionState = Me.Adapter.DeleteCommand.Connection.State 
     If ((Me.Adapter.DeleteCommand.Connection.State And Global.System.Data.ConnectionState.Open) _ 
        <> Global.System.Data.ConnectionState.Open) Then 
      Me.Adapter.DeleteCommand.Connection.Open 
     End If 
     Try 
      Dim returnValue As Integer = Me.Adapter.DeleteCommand.ExecuteNonQuery 
      Return returnValue 
     Finally 
      If (previousConnectionState = Global.System.Data.ConnectionState.Closed) Then 
       Me.Adapter.DeleteCommand.Connection.Close 
      End If 
     End Try 
    End Function 
+0

Wie viele Argumente haben Sie gefunden objectdatasource löschende Ereignis? –

+0

haben Sie OldValuesParameterFormatString = "original_ {0}" in OldValuesParameterFormatString = "{0}" geändert –

Antwort

2

Sie haben ein Problem mit dem Attribut OldValuesParameterFormatString - das Verfahren Kräfte 2 Argumente zu akzeptieren. Entfernen Sie das Attribut überhaupt.

+0

Ich kann diese Einstellung nicht entfernen, die das Update benötigt. – Robert

+0

Fügen Sie dann dieses fiktive Delete wie erwartet hinzu – Dewfy

+0

Ich habe den erwarteten Parameter zum gespeicherten proc hinzugefügt, aber das machte keinen Unterschied. Das Markup zeigt jedoch an, dass die DELETE-Anweisung diesen Parameter sowieso nicht erwartet, nicht im Dataset-Designer oder auf der Seite. Viele Menschen haben diesen Fehler und die Änderung der oldvaluesparametersformatstring sollte nicht wirklich notwendig sein, da das Objekt sowieso eine alte und neue beibehalten sollte. Vielleicht sollte ich den delete-Parameter in die original_-Version ändern und habe das versucht, aber ich habe nur meine eigene stattdessen und weg mit dem Hit und vermisse automatisch generierte Klassen. – Robert

0

Derselbe Fehler trat bei mir auf und ich löste es, indem ich nur den Wert des Attributs OldValuesParameterFormatString von "original_ {0}" auf nur "{0}" änderte.

Hoffe, das hilft.

0

Sie müssen sicherstellen, dass Ihre Parameternamen an allen Stellen übereinstimmen. Wenn dieser Fehler angezeigt wird: ObjectDataSource konnte keine nicht generische Methode mit Parametern finden. Wahrscheinlichkeiten sind deine ids stimmen nicht überall überein.

Hier ist ein Beispiel, Beachten Sie die id 'ScheduleId' im Netz verwendet, ods paramters und Datenzugriffsfunktion

<asp:GridView ID="uxgvSchedule" DataKeyNames="ScheduleId" ... 

<asp:TemplateField HeaderText=""> 
    <ItemTemplate> 
     <asp:LinkButton ID="lblDeleteSchedule" runat="server" CommandName="Delete" Text="Delete" CommandArgument="<%# CType(Container, GridViewRow).RowIndex %>" /> 
    </ItemTemplate> 
</asp:TemplateField> 

</asp:GridView> 

<asp:ObjectDataSource ID="odsSchedule" DeleteMethod="DeleteSchedule" OnDeleting="odsSchedule_Deleting" ... /> 

<DeleteParameters> 
    <asp:Parameter Name="ScheduleId" Type="Int32" /> 
</DeleteParameters> 

Protected Sub uxgvSchedule_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Handles uxgvSchedule.RowCommand 
Try 
    Dim tempInt As Integer 
    If Integer.TryParse(e.CommandArgument, tempInt) Then 
     Dim row As GridViewRow = uxgvSchedule.Rows(Convert.ToInt32(e.CommandArgument)) 
     Dim rowkey As DataKey = uxgvSchedule.DataKeys(row.RowIndex) 
     uxlblScheduleId.Text = rowkey.Value 
    End If 
Catch ex As Exception 
End Try 
End Sub 

Protected Sub odsSchedule_Deleting(ByVal sender As Object, ByVal e As ObjectDataSourceMethodEventArgs) Handles odsSchedule.Deleting 
    ************VERY COMMON CAUSE - FIX ****************** 
    'e.InputParameters("ScheduleId") = uxlblScheduleId.Text 

    '2nd time i ran into this problem the error was indicating more 
    'than one parameter or a completely different set of parameters, 
    'so I would nearly do this instead from now on in this function 
    e.InputParameters.Clear() 
    e.InputParameters.Add("ScheduleId", uxlblScheduleId.Text) 
End Sub 

Public Function DeleteSchedule(ByVal ScheduleId As Integer) As Integer 
    Dim rowsAffected As Integer = 0 
    Dim con As SqlConnection = New SqlConnection(connectionString) 
    Dim cmd As SqlCommand = New SqlCommand("DeleteSchedule", con) 
    cmd.CommandType = CommandType.StoredProcedure 

    cmd.Parameters.Add(New SqlParameter("@ScheduleId", SqlDbType.Int)) 
    cmd.Parameters("@ScheduleId").Value = ScheduleId 

    Try 
     con.Open() 
     rowsAffected = cmd.ExecuteNonQuery() 
    Catch sqlex As SqlException 
    Catch ex As Exception 
    Finally 
     con.Close() 
    End Try 
    Return rowsAffected 
End Function 
0

Definieren Sie die OldValuesParameterFormatString im ObjectDataSource' tag with the same name of DeleteParameters`.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    DeleteMethod="DeleteBook" SelectMethod="LoadAllBooks" **OldValuesParameterFormatString="ISBN"** 
    TypeName="BusinessLayer.clsBusiness"> 
    <DeleteParameters> 
     <asp:Parameter Name="ISBN" Type="Int32" /> 
    </DeleteParameters> 
</asp:ObjectDataSource> 
Verwandte Themen