如何将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
相关产品推荐
相关产品推荐

