【问题标题】:ObjectDataSource could not find a non-generic method that has parameters when using update and delete使用更新和删除时,ObjectDataSource 找不到具有参数的非泛型方法
【发布时间】:2016-02-01 16:43:35
【问题描述】:

您好,我收到此错误:

"ObjectDataSource 'ObjectDataSource1' 找不到非泛型 具有参数的方法“UpdateEmployee”:originalEmployeeId, originalName, originalGender, originalCity, EmployeeId, 姓名, 性别, 城市。”

当我按下更新按钮时。但是我的删除按钮没有问题。这是我的代码:
WebForm1.aspx

<form id="form1" runat="server">
<div>

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataSourceID="ObjectDataSource1" DataKeyNames="EmployeeId">
        <Columns>
            <asp:CommandField ShowEditButton="True" ShowDeleteButton="True" />
            <asp:BoundField DataField="EmployeeId" HeaderText="EmployeeId" 
                SortExpression="EmployeeId" />
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:BoundField DataField="Gender" HeaderText="Gender" 
                SortExpression="Gender" />
            <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
        </Columns>
    </asp:GridView>
    <br />
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
        SelectMethod="GetAllEmployee2S" TypeName="EditingData.Employee2" 
        UpdateMethod="UpdateEmployee" DeleteMethod="DeleteEmployee" ConflictDetection="CompareAllValues" OldValuesParameterFormatString="original{0}">
        <DeleteParameters>
            <asp:Parameter Name="originalEmployeeId" Type="Int32" />
            <asp:Parameter Name="originalName" Type="String" />
            <asp:Parameter Name="originalGender" Type="String" />
            <asp:Parameter Name="originalCity" Type="String" />
        </DeleteParameters>
        <UpdateParameters>
            <asp:Parameter Name="originalEmployeeId" Type="Int32" />
            <asp:Parameter Name="originalName" Type="String" />
            <asp:Parameter Name="originalGender" Type="String" />
            <asp:Parameter Name="originalCity" Type="String" />
        </UpdateParameters>
    </asp:ObjectDataSource>

</div>
</form>

Employee2.cs

public static List<Employee2> GetAllEmployee2S()
    {
        var dal = new Employee2Dal();
        return dal.GetAllEmployee2S();
    }
    public static void DeleteEmployee(int originalEmployeeId, string originalName, string originalGender, string originalCity)
    {
        var dal = new Employee2Dal();
        dal.DeleteEmployee(originalEmployeeId, originalName, originalGender, originalCity);
    }
    public static void UpdateEmployee(int originalEmployeeId, string originalName, string originalGender, string originalCity)
    {
        var dal = new Employee2Dal();
        dal.UpdateEmployee(originalEmployeeId, originalName, originalGender, originalCity);
    }

Employee2Dal.cs

public void DeleteEmployee(int originalEmployeeId, string originalName, string originalGender, string originalCity)
    {
        var cs = ConfigurationManager.ConnectionStrings["DBConnectionString"].ConnectionString;
        using (var con = new SqlConnection(cs))
        {
            const string deleteQuery = "Delete from Employee2 where EmployeeId=@OriginalEmployeeId and Name = @OriginalName and Gender = @OriginalGender and " +
                                       "City = @OriginalCity";
            var cmd = new SqlCommand(deleteQuery, con);
            cmd.Parameters.AddWithValue("@OriginalEmployeeId", originalEmployeeId);
            cmd.Parameters.AddWithValue("@OriginalName", originalName);
            cmd.Parameters.AddWithValue("@OriginalGender", originalGender);
            cmd.Parameters.AddWithValue("@OriginalCity", originalCity);
            con.Open();
            cmd.ExecuteNonQuery();
        }
    }
    public void UpdateEmployee(int employeeId, string name, string gender, string city)
    {
        var cs = ConfigurationManager.ConnectionStrings["DBConnectionString"].ConnectionString;
        using (var con = new SqlConnection(cs))
        {
            const string updateQuery = "Update Employee2 set Name=@Name, Gender=@Gender, City=@City where EmployeeId=@EmployeeId";
            var cmd = new SqlCommand(updateQuery, con);
            cmd.Parameters.AddWithValue("@EmployeeId", employeeId);
            cmd.Parameters.AddWithValue("@Name", name);
            cmd.Parameters.AddWithValue("@Gender", gender);
            cmd.Parameters.AddWithValue("@City", city);
            con.Open();
            cmd.ExecuteNonQuery();
        }
    }

【问题讨论】:

  • 抱歉编辑。我复制了你提出的建议,但仍然存在:'找不到具有参数的非泛型方法'UpdateEmployee':EmployeeId、Name、Gender、City、originalEmployeeId、originalName、originalGender、originalCity。为什么objectdatasource只需要4个参数,却要找8个参数,好像也在组合delete参数。
  • 当我删除 ConfilictDetection 时,更新命令有效,但删除命令无效。这是否意味着我不能将 ConflictDetection 与 UpdateCommand 一起使用?

标签: c# asp.net


【解决方案1】:

您的代码可以正常工作,因为Delete 方法不需要当前的参数值。因此,您只有旧值参数,其格式为 orignial{0}'. But withUpdatemethod you have both old and current values. Old values are also formatted withoriginal{0}` 前缀,但当前值使用未修改的 GridView 字段名称传递。所以你总共有 8 个参数:

originalEmployeeId, originalName, originalGender, originalCity
employeeId, name, gender, city

您可以简单地将缺少的参数添加到 UpdateEmployee 方法。但我认为您在这里不需要原始值。甚至更多 - 除了员工 ID,您不需要 DeleteEmployee 方法的任何值。所以不要使用原始值(注意ConflictDetection 应该等于 OverwriteChanges 以关闭传递给 Update 方法的原始值):

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    TypeName="EditingData.Employee2"
    SelectMethod="GetAllEmployee2S"  
    UpdateMethod="UpdateEmployee"
    DeleteMethod="DeleteEmployee" ConflictDetection="OverwriteChanges">       
</asp:ObjectDataSource>

并让GridView传递字段名对应的参数

public static void DeleteEmployee(int employeeId)
{
    var dal = new Employee2Dal();
    dal.DeleteEmployee(employeeId); // modify dal method
}
public static void UpdateEmployee(int employeeId, string name, string gender, string city)
{
    var dal = new Employee2Dal();
    dal.UpdateEmployee(employeeId, name, gender, city);
}

【讨论】:

  • 我编辑了 UpdateEmployee 本身。请参阅新的 UpdateEmployee。我仍然有同样的问题。
  • @Ibanez1408 请不要编辑问题。您只能添加描述原始问题的详细信息。重命名UpdateEmployee 中的参数也是一种解决方案,但我认为orignalNameoriginalGender 等是更新参数的误导性名称。
  • 哦,我现在明白了,谢尔盖。但是,我无法更改 ConfictDetection,因为我需要在删除货币中使用它。
猜你喜欢
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多