ASP.NET GridView不会将更新保存在数据库中

问题描述:

SELECT works,Edit按钮可以工作,但是在编辑之后,当我按下“Save”时,Grid将返回到更改之前并且数据库中没有更改。 SELECT使用3个表,UPDATE应该只更新主表,但仍然没有任何反应。ASP.NET GridView不会将更新保存在数据库中

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="idw" AllowSorting="True" DataSourceID="SqlDataSourceGrid">   
    <Columns> 
    <asp:CommandField ShowEditButton="True" /> 
    <asp:BoundField DataField="idw" HeaderText="idw" InsertVisible="False" ReadOnly="True" SortExpression="idw" /> 
    <asp:BoundField DataField="name" HeaderText="name" ReadOnly="True" SortExpression="name" /> 
    <asp:BoundField DataField="surname" HeaderText="surname" ReadOnly="True" SortExpression="surname" /> 
    <asp:BoundField DataField="item_name" HeaderText="item_name" ReadOnly="True" SortExpression="item_name" /> 
    <asp:BoundField DataField="item_serial" HeaderText="item_serial" ReadOnly="True" SortExpression="item_serial" /> 
    <asp:BoundField DataField="date_taken" HeaderText="date_taken" SortExpression="date_taken" /> 
    <asp:BoundField DataField="notes" HeaderText="notes" SortExpression="notes" /> 
    </Columns> 
</asp:GridView> 
<asp:SqlDataSource ID="SqlDataSourceGrid" runat="server" ConnectionString="<%$ ConnectionStrings:WarehouseConnectionString %>" 
SelectCommand="SELECT idw, name, surname, item_name, item_serial, date_taken, notes FROM Warehouse w JOIN Users u ON w.idu=u.idu JOIN Items i ON i.ids=i.ids" 
UpdateCommand="UPDATE Warehouse SET [email protected]_taken, [email protected] WHERE [email protected]"> 
<UpdateParameters> 
    <asp:Parameter Name="date_taken" /> 
    <asp:Parameter Name="notes" /> 
    <asp:Parameter Name="idw" /> 
</UpdateParameters> 

我读过的多个例子和教程,一切都应该罚款。我已经在SqlDataSource中“手动”编写了SELECT和UPDATE命令,也许这就是问题所在?

在此先感谢您的任何建议。

+2

您是否阅读了本文** http://msdn.microsoft.com/en-us/library/ms972948.aspx** – 2012-03-23 09:57:56

+0

@huMptyduMpty是的,我想我的代码是相似的。当我使用自定义选择查询时,我无法自动生成插入,更新和删除。 – yosh 2012-03-23 10:04:09

我用代码隐藏解决方案,最终,手动编码:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    string id = ... 
    string notes = ...  
    UpdateDB(id, notes);  
    GridView1.EditIndex = -1; 
    bind_grid(); 
} 

可能实际上给我过来的数据更多的控制。

maybe that's the problem? 

最后一个音符后,现在我看到你已经在您尝试更新的值设置ReadOnly="True"。将其更改为false(或将其删除),并且它们将被更新。

+0

类型不起作用,并且在UpdateParameters中,我只有不是ReadOnlym的参数和ID。 – yosh 2012-03-23 12:09:56

+0

现在我明白了,你已经设置了ReadOnly = true,这是问题所在!改变它们。 – Aristos 2012-03-23 12:23:30

+0

我只ReadOnly在我不更新的字段上...我只更新“date_taken”和“笔记”。 – yosh 2012-03-23 14:38:37

请参见本例以下,并尝试更改代码如下:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
     DataKeyNames="EmployeeId" DataSourceID="SqlDataSource1"> 
     <Columns> 
      <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" 
       ShowSelectButton="True" /> 
      <asp:BoundField DataField="EmployeeId" HeaderText="EmployeeId" 
       InsertVisible="False" ReadOnly="True" SortExpression="EmployeeId" /> 
      <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
      <asp:BoundField DataField="Salary" HeaderText="Salary" 
       SortExpression="Salary" /> 
     </Columns> 
    </asp:GridView> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
     DeleteCommand="DELETE FROM [Employee] WHERE [EmployeeId] = @EmployeeId" 
     InsertCommand="INSERT INTO [Employee] ([Name], [Salary]) VALUES (@Name, @Salary)" 
     SelectCommand="SELECT * FROM [Employee]" 
     UpdateCommand="UPDATE [Employee] SET [Name] = @Name, [Salary] = @Salary WHERE [EmployeeId] = @EmployeeId"> 
     <DeleteParameters> 
      <asp:Parameter Name="EmployeeId" Type="Int64" /> 
     </DeleteParameters> 
     <InsertParameters> 
      <asp:Parameter Name="Name" Type="String" /> 
      <asp:Parameter Name="Salary" Type="String" /> 
     </InsertParameters> 
     <UpdateParameters> 
      <asp:Parameter Name="Name" Type="String" /> 
      <asp:Parameter Name="Salary" Type="String" /> 
      <asp:Parameter Name="EmployeeId" Type="Int64" /> 
     </UpdateParameters> 
    </asp:SqlDataSource> 
+0

这与我的不同?我不需要删除和插入。 – yosh 2012-03-23 14:44:16

您可以标记通过设置它的只读属性为True一个GridView列不可编辑。尝试删除此属性。另外,设置更新参数的类型 - 即DateTime,string和int32。

+0

没有帮助。我没有ReadOnly上我更新的列... – yosh 2012-03-23 14:40:21

您必须手动编写从后面的代码:

SqlDataSourceGrid.UpdateCommand = "UPDATE Warehouse SET date_taken=date_taken1, notes=note1 WHERE idw=1";