You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DataTable修改后的数据回写并正确显示日期格式?

我来帮你解决这两个ASP.NET开发中的问题:

问题1:修改DataTable中的数据后,如何回写到对应数据表?

要把DataTable的修改同步回数据库,核心是利用SqlDataAdapter的Update方法,但得先让它具备生成更新/插入/删除命令的能力,最简单的方式是用SqlCommandBuilder自动生成这些命令。具体操作和示例如下:

  • 确保SqlDataAdapter关联了正确的查询命令(也就是你用来填充DataTable的Select语句)
  • 创建SqlCommandBuilder并绑定到SqlDataAdapter,它会根据Select命令自动生成对应的Update、Insert、Delete命令(前提是查询结果包含主键或唯一标识列,否则无法生成)
  • 修改DataTable数据后,调用SqlDataAdapter.Update(DataTable)方法,就能把修改同步到数据库

示例代码:

// 用using包裹连接,自动管理连接的打开和关闭,避免资源泄漏
using (SqlConnection con = new SqlConnection("你的数据库连接字符串"))
{
    string query = "SELECT FirstName, LastName, ExpireDate FROM 你的目标表名";
    SqlCommand cmd = new SqlCommand(query, con);
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    
    // 创建命令构建器,自动生成更新相关的SQL命令
    SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(sda);
    
    DataTable dt = new DataTable();
    sda.Fill(dt); // 从数据库加载数据到DataTable
    
    // 这里模拟修改DataTable的数据,比如修改第一行的FirstName
    if (dt.Rows.Count > 0)
    {
        dt.Rows[0]["FirstName"] = "UpdatedName";
    }
    
    // 将修改回写到数据库,返回受影响的行数
    int affectedRows = sda.Update(dt);
    // 可以根据affectedRows判断是否更新成功
}

如果你的查询是复杂自定义SQL,SqlCommandBuilder可能无法正确生成命令,这时候需要手动给SqlDataAdapter设置UpdateCommand、InsertCommand、DeleteCommand,不过大部分简单场景用SqlCommandBuilder就足够。

问题2:GridView中ExpireDate列日期格式不生效的问题

先帮你揪出代码里的核心问题:逻辑顺序完全反了——你先创建了空的DataTable,然后去遍历它的行(这时候根本没有数据行,遍历代码等于白跑),之后才调用sda.Fill(dt)把数据库数据填充进去,之前的格式转换操作直接被覆盖了。而且就算顺序对了,把DateTime转成字符串存到DataTable里,GridView绑定的时候也可能因为列类型问题,又显示回原来的格式。

给你两种解决方案,推荐第二种更简洁的方式:

方案1:修正后台代码的逻辑顺序

先填充DataTable,再遍历行修改日期格式,同时处理空值避免报错:

using (SqlConnection con = new SqlConnection("你的连接字符串"))
{
    con.Open();
    using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) {
        DataTable dt = new DataTable();
        sda.Fill(dt); // 先填充数据,DataTable才有行
        
        // 遍历每一行处理日期格式
        foreach (DataRow dr in dt.Rows) {
            // 先判断字段是否为空,避免空引用报错
            if (dr["ExpireDate"] != DBNull.Value) {
                // 直接转成DateTime再格式化,比ToString后再Parse更高效
                dr["ExpireDate"] = ((DateTime)dr["ExpireDate"]).ToShortDateString();
            }
        }
        
        tblBoard.DataSource = dt;
        tblBoard.DataBind();
    }
}
// 用using包裹连接的话,不需要手动调用con.Close(),会自动释放资源

方案2:直接在GridView的BoundField中设置格式(推荐)

不需要修改后台代码,直接在ASPX页面的BoundField里配置DataFormatString和HtmlEncode="False",就能让GridView直接显示你想要的日期格式:

<asp:GridView ID="tblBoard" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="First Name" />
        <asp:BoundField DataField="LastName" HeaderText="Last Name" />
        <asp:BoundField DataField="ExpireDate" HeaderText="Expire Date" 
            DataFormatString="{0:yyyy-MM-dd}" HtmlEncode="False" />
    </Columns>
</asp:GridView>
  • DataFormatString="{0:yyyy-MM-dd}":格式可以按需修改,比如{0:MM/dd/yyyy}、{0:yyyy年MM月dd日}都可以
  • HtmlEncode="False":必须设置这个属性,否则GridView会把格式化后的日期转义成HTML实体,导致格式不生效

内容的提问来源于stack exchange,提问作者Shane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:07:24