嘿,我正在学习如何使用asp.net,我正在尝试使用网格视图来显示信息,并使用详细信息视图编辑/删除数据库中的信息。现在我可以编辑和更新数据库中的信息,但我也希望它删除,但有些东西对我不起作用。我设置了一个异常,当我选择项目并按delete键时,它会弹出我的异常,即另一个用户已经删除了该项目,而它还没有删除。我真的不确定我做错了什么,对我来说,这似乎应该奏效。
以下是详细信息视图中删除命令和参数的代码
DeleteCommand="DELETE FROM [Customers]
WHERE [CustomerID] = @original_CustomerID
AND [Name] = @original_Name
AND [Address] = @original_Address
AND [City] = @original_City
AND [State] = @original_State
AND [ZipCode] = @original_ZipCode
AND ([Phone] = @original_Phone
OR [Phone] IS NULL AND @original_Phone IS NULL)
AND ([Email] = @original_Email
OR [Email] IS NULL AND @original_Email IS NULL)"
<DeleteParameters>
<asp:Parameter Name="original_CustomerID" Type="Int32" />
<asp:Parameter Name="original_Name" Type="String" />
<asp:Parameter Name="original_Address" Type="String" />
<asp:Parameter Name="original_City" Type="String" />
<asp:Parameter Name="original_State" Type="String" />
<asp:Parameter Name="original_ZipCode" Type="String" />
<asp:Parameter Name="original_Phone" Type="String" />
<asp:Parameter Name="original_Email" Type="String" />
</DeleteParameters>
这是cs文件中的删除功能
protected void DetailsView1_ItemDeleted(object sender, DetailsViewDeletedEventArgs e)
{
if (e.Exception != null)
{
lblError.Text = "A database error has occurred.<br /><br />" +
"Message: " + e.Exception.Message;
e.ExceptionHandled = true;
}
else if (e.AffectedRows == 0)
lblError.Text = "Another user may have deleted that customer."
+ "<br />Please try again.";
else
GridView1.DataBind();
}
protected void DetailsView1_ItemDeleting(
object sender, DetailsViewDeleteEventArgs e)
{
e.Values["Name"]
= e.Values["Name"].ToString().Substring(1);
}
为什么要对delete语句进行如此庞大的查询?在MSDN DetailsView示例中查看它是如何完成的
SQL表中的CustomerID应该是唯一的,因此删除语句应该简单到:
DeleteCommand="DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID"
只有一个删除参数:
<DeleteParameters>
<asp:Parameter Name="original_CustomerID" Type="Int32" />
</DeleteParameters>
另外一件非常重要的事情是,您需要在DetailsView上设置DataKeyNames="CustomerID"
,以便DetailsView1_ItemDeleted
知道要删除哪一行。希望这能有所帮助!