Asp.net 找不到具有参数的非泛型方法“Delete”

Asp.net 找不到具有参数的非泛型方法“Delete”,asp.net,Asp.net,这是使用绑定到ObjectDataSource的Gridview控件时从.net返回的字符串。ObjectDataSource绑定到.net数据集中的tableAdapter 数据集有一个自动生成的表适配器,它在我的数据库中创建了一个更新、插入、选择和删除存储过程 网格现在正在使用此源,应该允许插入、更新和删除 Insert和updates正在工作,但delete特别指出了错误 ObjectDataSource“ODSCustomerAlias”找不到具有以下参数的非泛型方法“Delete”:C

这是使用绑定到ObjectDataSource的Gridview控件时从.net返回的字符串。ObjectDataSource绑定到.net数据集中的tableAdapter

数据集有一个自动生成的表适配器,它在我的数据库中创建了一个更新、插入、选择和删除存储过程

网格现在正在使用此源,应该允许插入、更新和删除

Insert和updates正在工作,但delete特别指出了错误

ObjectDataSource“ODSCustomerAlias”找不到具有以下参数的非泛型方法“Delete”:CustomerAlias、original_CustomerAlias

虽然我可以读取错误,但我已经尝试了很多方法,但都无法实现。我真的看不出它是如何期望参数“original_CustomerAlias”的

我可以确认此参数在进程中不存在

下面是一些似乎正确的代码片段

<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>
自动生成的数据集中的部分

<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>
我想设计师的最后一段代码实际上并不相关,但

<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

属性OldValuesParameterFormatString有问题-该属性强制方法接受2个参数。只需删除它属性。

同样的错误发生在我身上,我只需将OldValuesParameterFormatString属性的值从原始的{0}更改为仅{0}即可解决


希望这有帮助。

您必须确保参数名称在所有地方都匹配。 如果看到此错误:ObjectDataSource找不到具有参数的非泛型方法。很可能你的身份证在所有地方都不匹配

下面是一个示例,请注意网格、ods参数和数据访问函数中使用的id“ScheduleId”

<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
在ObjectDataSource标记中使用相同的deletParameters名称定义OldValuesParameterFormatString

<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>

找到了多少个objectdatasource删除事件的参数?是否已将OldValuesParameterFormatString=original_{0}更改为OldValuesParameterFormatString={0}然后将此虚拟对象添加到预期删除我确实将预期参数添加到存储过程中,但这没有任何区别。但是标记显示delete语句无论如何都不需要这个参数,不管是在数据集设计器中还是在页面上。很多人都有这个错误,更改oldvaluesparameterformatstring应该不是必需的,因为该对象无论如何都应该维护旧的和新的。也许我应该将delete参数更改为原始版本,并尝试这样做,但我只是编写了自己的代码,并取消了命中和未命中的自动生成类。