使用SqlDataAdapter.Update和RowUpdating从gridview更新数据库

时间:2010-11-23 10:30:39

标签: c# .net sql

在阅读有关我的问题的其他类似问题后,我发布了这个问题,但没有真正了解我如何使用这些信息。

我一直在编写此代码,以了解如何使用SqlDataAdapters从GridView更新数据库。

我正在我的aspx页面中编写GridView,如下所示:

<asp:GridView ID="Clients" runat="server">
    <Columns>
        <asp:TemplateField HeaderText="Name" SortExpression="Name">
            <ItemTemplate>
                <asp:Label ID="labelName" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="textboxName" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:CommandField EditText="Edit" ShowEditButton="true" />
    </Columns>
</asp:GridView>

然后在我的代码隐藏文件中,我正在编写以下代码(数据库只是一个连接到我的数据库的类......):

Database database = new Database();
database.open_connection();

SqlCommand command = new SqlCommand(query, database.dbConnection);
SqlDataAdapter adapter = new SqlDataAdapter(command);

DataTable dataTable = new DataTable();
adapter.Fill(dataTable);

SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

Clients.AutoGenerateColumns = false;
Clients.PageIndexChanging += new GridViewPageEventHandler(this.grid_view_page_index_changing);
Clients.Sorting += new GridViewSortEventHandler(this.grid_view_sorting);
Clients.RowEditing += new GridViewEditEventHandler(this.row_editing);
Clients.RowUpdating += new GridViewUpdateEventHandler(this.row_updating);
Clients.RowCancelingEdit += new GridViewCancelEditEventHandler(this.row_canceling_edit);
Clients.AllowPaging = true;
Clients.PageSize = 25;
Clients.AllowSorting = true;
Clients.DataSource = dataTable;
Clients.DataBind();

database.close_connection();

到目前为止一切正常; GridView排序,编辑,RowCancellingEdit,PageIndexChanging等功能都可以正常工作。

我的问题是当我调用RowUpdating函数时。

我想要做的是使用adapter.Update()函数来更新数据库。

它不会对我当前的代码产生任何错误,但它也不会更新数据库。

一旦我点击更新,我的GridView中的编辑文本框就会消失,在尝试编辑之前我会保留原始值。

这是我的row_updating()功能:

public void row_updating(object sender, GridViewUpdateEventArgs e) {
    GridViewRow gvr = gridView.Rows[Clients.EditIndex];

    TextBox txt = (TextBox)gvr.Cells[0].FindControl("textboxName");
    e.NewValues["Name"] = txt.Text;

    adapter.Update((DataTable)Clients.DataSource);

    Clients.EditIndex = -1;
    Clients.DataBind();
}

我无法弄清楚为什么它不会更新数据库(可能是因为我完全错了)

我在互联网上看过提到EndEdit()功能的内容,但我不确定这是否适用于此。

如果有人能告诉我我做错了什么以及为什么我的数据库不会更新,那将非常感激。

2 个答案:

答案 0 :(得分:0)

您是否为数据适配器创建了UpdateCommand。如果没有,那么我认为您可能需要这样做才能成功更新数据。

另请查看此MSDN链接:

  

如果INSERT,UPDATE或DELETE   声明没有说明,   Update方法生成一个   例外。但是,您可以创建一个   SqlCommandBuilder或   OleDbCommandBuilder对象   自动生成SQL语句   如果设置,则为单表更新   .NET的SelectCommand属性   框架数据提供者。然后,任何   您执行的其他SQL语句   未设置是由...生成的   CommandBuilder的。这一代逻辑   需要关键列信息   存在于DataSet中。更多   信息请参阅生成命令   使用CommandBuilders(ADO.NET)。

     

Update方法从中检索行   第一个映射中列出的表   在执行更新之前。该   然后使用更新然后刷新行   UpdatedRowSource的值   属性。返回任何其他行   被忽略了。

     

将任何数据加载回   DataSet,OnRowUpdated事件是   提出,允许用户检查   已协调的DataSet行和任何   输出的输出参数   命令。一行更新后   成功,对该行的更改   被接受了。

     

使用Update时,顺序为   执行如下:

The values in the DataRow are moved to the parameter values.

The OnRowUpdating event is raised.

The command executes.

If the command is set to FirstReturnedRecord, then the first
     

返回的结果放在   的DataRow。

If there are output parameters, they are placed in the DataRow.

The OnRowUpdated event is raised.

AcceptChanges is called.

答案 1 :(得分:0)

我改变了我的row_updating()函数代码,这些代码在这里没有太多的相关性,但为我修复它的事情是确保我使用了!Page.IsPostBack

所以现在我的Page_Load()函数设置了GridView,然后只是绑定数据:

if(!Page.IsPostBack) {
    Clients.DataBind();
}

虽然它不能很好地工作,但至少它现在正在更新我的数据库(这就是这个问题的内容,所以如果我找不到新问题的解决方案,我会发布一个新问题)

有时它只是导致最令人沮丧的问题的最简单的事情......