使用更新时的ObjectDataSource找不到具有参数的非泛型方法和删除 [英] ObjectDataSource could not find a non-generic method that has parameters when using update and delete

查看:148
本文介绍了使用更新时的ObjectDataSource找不到具有参数的非泛型方法和删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到这个错误:


  

的ObjectDataSource'ObjectDataSource1找不到非泛型
  方法UpdateEmployee'有参数:originalEmployeeId,
  ORIGINALNAME,originalGender,originalCity,雇员,姓名,性别,
  市。


当我preSS更新按钮。但我的删除按钮没有按;吨有一个问题。这是我的code:结果
WebForm1.aspx的

 <表ID =form1的=服务器>
< D​​IV>    < ASP:GridView控件ID =GridView1=服务器的AutoGenerateColumns =FALSE
        的DataSourceID =ObjectDataSource1的DataKeyNames =雇员>
        <柱体和GT;
            < ASP:CommandField中ShowEditButton =真的ShowDeleteButton =真/>
            < ASP:BoundField的数据字段=雇员的HeaderText =雇员
                SORTEX pression =雇员/>
            < ASP:BoundField的数据字段=名称的HeaderText =名称SORTEX pression =名称/>
            < ASP:BoundField的数据字段=性别的HeaderText =性别
                SORTEX pression =性别/>
            < ASP:BoundField的数据字段=城的HeaderText =城市SORTEX pression =城市/>
        < /专栏>
    < / ASP:GridView的>
    < BR />
    < ASP:ObjectDataSource控件ID =ObjectDataSource1=服务器
        SelectMethod =GetAllEmployee2S的TypeName =EditingData.Employee2
        UpdateMethod =UpdateEmployeeDeleteMethod =DeleteEmployeeConflictDetection =CompareAllValues​​OldValues​​ParameterFormatString =原{0}>
        < D​​eleteParameters>
            < ASP:参数名称=originalEmployeeIdTYPE =的Int32/>
            < ASP:参数名称=ORIGINALNAME类型=字符串/>
            < ASP:参数名称=originalGender类型=字符串/>
            < ASP:参数名称=originalCity类型=字符串/>
        < / DeleteParameters>
        < UpdateParameters>
            < ASP:参数名称=originalEmployeeIdTYPE =的Int32/>
            < ASP:参数名称=ORIGINALNAME类型=字符串/>
            < ASP:参数名称=originalGender类型=字符串/>
            < ASP:参数名称=originalCity类型=字符串/>
        < / UpdateParameters>
    < / ASP:ObjectDataSource控件>< / DIV>
< /表及GT;

Employee2.cs

 公共静态列表<&和Employee2 GT; GetAllEmployee2S()
    {
        VAR DAL =新Employee2Dal();
        返回dal.GetAllEmployee2S();
    }
    公共静态无效DeleteEmployee(INT originalEmployeeId,串ORIGINALNAME,串originalGender,串originalCity)
    {
        VAR DAL =新Employee2Dal();
        dal.DeleteEmployee(originalEmployeeId,ORIGINALNAME,originalGender,originalCity);
    }
    公共静态无效UpdateEmployee(INT originalEmployeeId,串ORIGINALNAME,串originalGender,串originalCity)
    {
        VAR DAL =新Employee2Dal();
        dal.UpdateEmployee(originalEmployeeId,ORIGINALNAME,originalGender,originalCity);
    }

Employee2Dal.cs

 公共无效DeleteEmployee(INT originalEmployeeId,串ORIGINALNAME,串originalGender,串originalCity)
    {
        变种CS = ConfigurationManager.ConnectionStrings [DBConnectionString]的ConnectionString。
        使用(VAR CON =新的SqlConnection(CS))
        {
            常量字符串deleteQuery =从和Employee2删除,其中雇员= @ OriginalEmployeeId和Name = @OriginalName和性别= @OriginalGender和+
                                       城市= @OriginalCity;
            VAR CMD =新的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();
        }
    }
    公共无效UpdateEmployee(INT雇员,字符串名称,字符串性别,串市)
    {
        变种CS = ConfigurationManager.ConnectionStrings [DBConnectionString]的ConnectionString。
        使用(VAR CON =新的SqlConnection(CS))
        {
            常量字符串updateQuery =更新和Employee2设置名称= @姓名,性别= @性别,市= @市,其中雇员= @雇员;
            VAR CMD =新的SqlCommand(updateQuery,CON);
            cmd.Parameters.AddWithValue(@雇员,雇员);
            cmd.Parameters.AddWithValue(@名,名);
            cmd.Parameters.AddWithValue(@性别,性别等);
            cmd.Parameters.AddWithValue(@城市,市);
            con.Open();
            cmd.ExecuteNonQuery();
        }
    }


解决方案

您code工作,因为删除方法不需要参数的当前值。所以你只有旧值参数,格式为 orignial {0}。但随着更新方法必须既古老和电流值。旧值也格式化原{0}`preFIX,但当前值与GridView的字段名称未经修改通过。所以,你完全有8个参数:

  originalEmployeeId,ORIGINALNAME,originalGender,originalCity
雇员,姓名,性别,城市

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

 < ASP:ObjectDataSource控件ID =ObjectDataSource1=服务器
    类型名=EditingData.Employee2
    SelectMethod =GetAllEmployee2S
    UpdateMethod =UpdateEmployee
    DeleteMethod =DeleteEmployeeConflictDetection =OverwriteChanges>
< / ASP:ObjectDataSource控件>

和GridView控件让传递参数对应的字段名

 公共静态无效DeleteEmployee(INT雇员)
{
    VAR DAL =新Employee2Dal();
    dal.DeleteEmployee(雇员); //修改DAL方法
}
公共静态无效UpdateEmployee(INT雇员,字符串名称,字符串性别,串市)
{
    VAR DAL =新Employee2Dal();
    dal.UpdateEmployee(雇员,姓名,性别,市);
}

Hi I am getting this error:

"ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'UpdateEmployee' that has parameters: originalEmployeeId, originalName, originalGender, originalCity, EmployeeId, Name, Gender, City."

when I press the update button. But my delete button doesn;t have an issue. This is my code:
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();
        }
    }

解决方案

Your code working, because Delete method does not require current values of parameters. So you have only old values parameters, which are formatted as orignial{0}'. But withUpdatemethod you have both old and current values. Old values are also formatted withoriginal{0}` prefix, but current values are passed with unmodified names of GridView fields. So you have totally 8 parameters:

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

You can simply add missing parameters to UpdateEmployee method. But I don't think you need original values here. And even more - you don't need any values for DeleteEmployee method except employee ID. So simply don't use original values (note that ConflictDetection should be equal to OverwriteChanges in order to turn off original values passing to Update method):

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

And let GridView pass parameters corresponding to field names

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);
}

这篇关于使用更新时的ObjectDataSource找不到具有参数的非泛型方法和删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆