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

ASP.NET中GridView仅更新名称时出现‘操作因当前状态无效’错误

问题分析与解决方案

可能原因

  1. 日期字段值为空触发SQL执行异常
    当仅更新名称时,若日期输入框txtCreated未加载原有日期值(变为空字符串),代码仍会执行to_date('','dd/mm/yyyy'),这会触发Oracle数据库的日期转换错误,最终被上层封装为operation is invalid due to current state提示。而你手动执行SQL时会填写合法日期,因此未出现问题。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:45:42