I'm trying to make a simple ListView with optimistic concurrency. It uses the VS-automatically-generated Delete, Insert, Update statements (except 1 change to insert: see code). Insert and Edit work fine and commit to the database. When trying to delete, I get this error:
I've tried just changing "CompareAllValues" to "OverwriteChanges" to postpone concurrency work for later, but that "breaks" Update and Delete commands, which just seem to refresh the ListView with the old values. The only threads I could find that resolved this issue involved changing to "OverwriteChanges" or were people who didn't have a "DataKeyNames" declared. Relevent markup is below (I hope).
Any thoughts?
<asp:SqlDataSource ID="ManageUsersSource" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
DeleteCommand="DELETE FROM [DUSER] WHERE [userid] = ? AND (([username] = ?) OR ([username] IS NULL AND ? IS NULL)) AND (([userpass] = ?) OR ([userpass] IS NULL AND ? IS NULL))"
InsertCommand="INSERT INTO [DUSER] ([username], [userpass]) VALUES (?, ?)"
OldValuesParameterFormatString="original_{0}"
ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>"
SelectCommand="SELECT * FROM [DUSER] ORDER BY [userid] ASC"
UpdateCommand="UPDATE [DUSER] SET [username] = ?, [userpass] = ? WHERE [userid] = ? AND (([username] = ?) OR ([username] IS NULL AND ? IS NULL)) AND (([userpass] = ?) OR ([userpass] IS NULL AND ? IS NULL))">
<DeleteParameters>
<asp:Parameter Name="original_userid" Type="Int16" />
<asp:Parameter Name="original_username" Type="String" />
<asp:Parameter Name="original_username" Type="String" />
<asp:Parameter Name="original_userpass" Type="String" />
<asp:Parameter Name="original_userpass" Type="String" />
</DeleteParameters>
<InsertParameters>
<%--This is removed since [userid] is an automatically generated index.--%>
<%--<asp:Parameter Name="userid" Type="Int16" />--%>
<asp:Parameter Name="username" Type="String" />
<asp:Parameter Name="userpass" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="username" Type="String" />
<asp:Parameter Name="userpass" Type="String" />
<asp:Parameter Name="original_userid" Type="Int16" />
<asp:Parameter Name="original_username" Type="String" />
<asp:Parameter Name="original_username" Type="String" />
<asp:Parameter Name="original_userpass" Type="String" />
<asp:Parameter Name="original_userpass" Type="String" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:ListView ID="ListView1" runat="server" DataKeyNames="userid"
DataSourceID="ManageUsersSource" InsertItemPosition="LastItem">
<AlternatingItemTemplate>
<tr style="background-color:#FFF8DC;">
<td>
<asp:Button ID="DeleteButton" runat="server" CommandName="Delete"
Text="Delete" />
<asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Edit" />
</td>
<td>
<asp:Label ID="useridLabel" runat="server" Text='<%# Eval("userid") %>' />
</td>
<td>
<asp:Label ID="usernameLabel" runat="server" Text='<%# Eval("username") %>' />
</td>
<td>
<asp:Label ID="userpassLabel" runat="server" Text='<%# Eval("userpass") %>' />
</td>
</tr>
</AlternatingItemTemplate>
<EditItemTemplate>
<tr style="background-color:#008A8C;color: #FFFFFF;">
<td>
<asp:Button ID="UpdateButton" runat="server" CommandName="Update"
Text="Update" />
<asp:Button ID="CancelButton" runat="server" CommandName="Cancel"
Text="Cancel" />
</td>
<td>
<asp:Label ID="useridLabel1" runat="server" Text='<%# Eval("userid") %>' />
</td>
<td>
<asp:TextBox ID="usernameTextBox" runat="server"
Text='<%# Bind("username") %>' />
</td>
<td>
<asp:TextBox ID="userpassTextBox" runat="server"
Text='<%# Bind("userpass") %>' />
</td>
</tr>
</EditItemTemplate>
<EmptyDataTemplate>
<table runat="server"
style="background-color: #FFFFFF;border-collapse: collapse;border-color: #999999;border-style:none;border-width:1px;">
<tr>
<td>
No data was returned.</td>
</tr>
</table>
</EmptyDataTemplate>
<InsertItemTemplate>
<tr style="">
<td>
<asp:Button ID="InsertButton" runat="server" CommandName="Insert"
Text="Insert" />
<asp:Button ID="CancelButton" runat="server" CommandName="Cancel"
Text="Clear" />
</td>
<td>
</td>
<td>
<asp:TextBox ID="usernameTextBox" runat="server"
Text='<%# Bind("username") %>' />
</td>
<td>
<asp:TextBox ID="userpassTextBox" runat="server"
Text='<%# Bind("userpass") %>' />
</td>
</tr>
</InsertItemTemplate>
<ItemTemplate>
<tr style="background-color:#DCDCDC;color: #000000;">
<td>
<asp:Button ID="DeleteButton" runat="server" CommandName="Delete"
Text="Delete" />
<asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Edit" />
</td>
<td>
<asp:Label ID="useridLabel" runat="server" Text='<%# Eval("userid") %>' />
</td>
<td>
<asp:Label ID="usernameLabel" runat="server" Text='<%# Eval("username") %>' />
</td>
<td>
<asp:Label ID="userpassLabel" runat="server" Text='<%# Eval("userpass") %>' />
</td>
</tr>
</ItemTemplate>
<LayoutTemplate>
<table runat="server">
<tr runat="server">
<td runat="server">
<table ID="itemPlaceholderContainer" runat="server" border="1"
style="background-color: #FFFFFF;border-collapse: collapse;border-color: #999999;border-style:none;border-width:1px;font-family: Verdana, Arial, Helvetica, sans-serif;">
<tr runat="server" style="background-color:#DCDCDC;color: #000000;">
<th runat="server">
</th>
<th runat="server">
userid</th>
<th runat="server">
username</th>
<th runat="server">
userpass</th>
</tr>
<tr ID="itemPlaceholder" runat="server">
</tr>
</table>
</td>
</tr>
<tr runat="server">
<td runat="server"
style="text-align: center;background-color: #CCCCCC;font-family: Verdana, Arial, Helvetica, sans-serif;color: #000000;">
<asp:DataPager ID="DataPager1" runat="server">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True"
ShowLastPageButton="True" />
</Fields>
</asp:DataPager>
</td>
</tr>
</table>
</LayoutTemplate>
<SelectedItemTemplate>
<tr style="background-color:#008A8C;font-weight: bold;color: #FFFFFF;">
<td>
<asp:Button ID="DeleteButton" runat="server" CommandName="Delete"
Text="Delete" />
<asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Edit" />
</td>
<td>
<asp:Label ID="useridLabel" runat="server" Text='<%# Eval("userid") %>' />
</td>
<td>
<asp:Label ID="usernameLabel" runat="server" Text='<%# Eval("username") %>' />
</td>
<td>
<asp:Label ID="userpassLabel" runat="server" Text='<%# Eval("userpass") %>' />
</td>
</tr>
</SelectedItemTemplate>
</asp:ListView>
Changing the non-Primary Key fields to use "Bind" instead of "Eval" in my ItemTemplate/AlternatingItemTemplate (just like an Edit Template) was apparently needed to properly pass along the old values.
This was a case of using automatically generated markup without fully understanding it (I still don't, really.)