ASP.NET中GridView仅更新名称时出现‘操作因当前状态无效’错误
问题分析与解决方案
可能原因
日期字段值为空触发SQL执行异常
当仅更新名称时,若日期输入框txtCreated未加载原有日期值(变为空字符串),代码仍会执行to_date('','dd/mm/yyyy'),这会触发Oracle数据库的日期转换错误,最终被上层封装为operation is invalid due to current state提示。而你手动执行SQL时会填写合法日期,因此未出现问题。GridView编辑模式下日期控件未绑定原有值
复制其他表的代码时,可能遗漏了当前GridView的RowDataBound事件处理,导致进入编辑模式时,txtCreated没有加载数据库中已有的日期值,用户未修改日期时该控件值为空。
解决方案
方案1:动态生成SQL,仅更新有修改的字段
修改代码逻辑,只在日期值有效时才更新CREATED_DATE字段:
int index = grdExcUsePolicy.EditIndex; GridViewRow row = grdExcUsePolicy.Rows[index]; string id = ((Label)row.FindControl("lblId")).Text; string name = ((TextBox)row.FindControl("txtName")).Text; string created = ((TextBox)row.FindControl("txtCreated")).Text; if (gridUtil.getInsertMode()) { // 插入逻辑 } else { StringBuilder updateSql = new StringBuilder("UPDATE EXCEPTIONAL_USE_POLICY_PARAM SET NAME = '{0}'"); List<object> sqlParams = new List<object> { name }; if (!string.IsNullOrWhiteSpace(created)) { updateSql.Append(", CREATED_DATE = to_date('{1}', 'dd/mm/yyyy')"); sqlParams.Add(created); } updateSql.Append(" WHERE ID = '{2}'"); sqlParams.Add(id); GeneralDbExecuterService.executeSqlNonQuery(string.Format(updateSql.ToString(), sqlParams.ToArray())); }
方案2:确保编辑模式下日期控件绑定原有值
在GridView的RowDataBound事件中,为编辑行的txtCreated设置原有日期值:
protected void grdExcUsePolicy_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowState == DataControlRowState.Edit) { DataRowView rowView = (DataRowView)e.Row.DataItem; TextBox txtCreated = (TextBox)e.Row.FindControl("txtCreated"); txtCreated.Text = ((DateTime)rowView["CREATED_DATE"]).ToString("dd/MM/yyyy"); } }
额外建议:消除SQL注入风险
当前代码用string.Format拼接SQL存在严重注入风险,建议改用参数化查询:
using (OracleConnection conn = new OracleConnection("你的数据库连接字符串")) { conn.Open(); string sql = "UPDATE EXCEPTIONAL_USE_POLICY_PARAM SET NAME = :name"; if (!string.IsNullOrWhiteSpace(created)) { sql += ", CREATED_DATE = to_date(:created, 'dd/mm/yyyy')"; } sql += " WHERE ID = :id"; OracleCommand cmd = new OracleCommand(sql, conn); cmd.Parameters.Add(":name", OracleDbType.Varchar2).Value = name; cmd.Parameters.Add(":id", OracleDbType.Varchar2).Value = id; if (!string.IsNullOrWhiteSpace(created)) { cmd.Parameters.Add(":created", OracleDbType.Varchar2).Value = created; } cmd.ExecuteNonQuery(); }
内容的提问来源于stack exchange,提问作者user20220054
相关产品推荐
相关产品推荐

