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

使用TO_TIMESTAMP时触发Oracle.ManagedDataAccess.Client.OracleException异常排查

解决Oracle日期查询参数化及日期过滤问题

问题根源排查

你的代码存在几个直接导致查询失败的错误:

  1. SQL语法错误:SELECT字段列表里混入了SET model=:Model这类属于UPDATE语句的语法,完全不符合SELECT规则
  2. 参数化占位符未正确使用:WHERE子句里直接写变量名StringFrom而非参数占位符,且表别名wbh1未在FROM子句中定义
  3. 参数名不匹配:SQL里的占位符是:Model,但代码里添加的参数是engineModel;日期参数也未与SQL占位符对应
  4. 日期处理方式错误:把DateTime转成字符串传递,容易引发格式解析问题,不如直接传递DateTime类型参数

修正后的代码

1. MBHQuery方法修正

public static DataTable MBHQuery(DateTime dateFrom, DateTime dateTo, string model)
{
    // 修正SQL语法,正确使用参数占位符和表别名
    string sql = @"
        SELECT
            HEADER_ID,
            model,
            series,
            short_name,
            published_dttm,
            VALID_DTTM
        FROM
            MBH wbh1  -- 定义表别名wbh1
        WHERE
            wbh1.PUBLISHED_DTTM >= :DateFrom 
            AND wbh1.PUBLISHED_DTTM <= :DateTo
            AND wbh1.model = :Model";  -- 添加型号过滤条件

    DataTable resultTable = null;
    if (IsConnected())
    {
        try
        {
            using OracleCommand cmd = new OracleCommand(sql, gmb.ServerConnection.oracleConnection);
            cmd.BindByName = true;

            // 直接绑定DateTime类型参数,无需转字符串
            cmd.Parameters.Add(":DateFrom", OracleDbType.Date).Value = dateFrom;
            cmd.Parameters.Add(":DateTo", OracleDbType.Date).Value = dateTo;
            cmd.Parameters.Add(":Model", OracleDbType.Varchar2).Value = model;

            using OracleDataAdapter adapter = new OracleDataAdapter(cmd);
            resultTable = new DataTable("HEADER");
            adapter.Fill(resultTable);
        }
        catch (Exception ex)
        {
            using ExceptionDialog exDialog = new ExceptionDialog(ex);
            exDialog.ShowDialog();
            resultTable = null;
        }
    }
    return resultTable;
}

2. 点击事件方法修正

public void PullDataTables_Click(object sender, EventArgs e)
{
    // 直接获取DateTime值,无需转成字符串
    DateTime dateFrom = this.MBdtpFrom.Value;
    DateTime dateTo = this.MBdtpTo.Value;

    // 若需仅保留日期部分(忽略时间),可使用以下写法,确保包含当天最后一刻
    // DateTime dateFrom = this.MBdtpFrom.Value.Date;
    // DateTime dateTo = this.MBdtpTo.Value.Date.AddDays(1).AddTicks(-1);

    gmb.ServerConnection.MBHQuery(dateFrom, dateTo, Model.Text);
}

关键注意事项

  • 避免SQL语法混淆:SELECT语句仅能写字段名或合法表达式,不要混入UPDATE的SET语法
  • 参数化查询规范:SQL里用:参数名作为占位符,代码添加参数时确保名称完全匹配,同时设置正确的OracleDbType
  • 日期类型直接绑定:直接传递DateTime类型给数据库参数,数据库会自动处理类型转换,避免手动转字符串带来的格式错误,无需再使用TO_TIMESTAMP函数
  • 表别名需提前定义:WHERE子句使用表别名时,必须在FROM子句中给表定义对应别名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:14:58