问题描述
我得到这个错误:
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 with
Updatemethod you have both old and current values. Old values are also formatted with
original{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找不到具有参数的非泛型方法和删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!