【问题标题】:ORA-01008: not all variables bound in C#ORA-01008: 并非所有变量都绑定在 C# 中
【发布时间】:2018-01-11 06:28:26
【问题描述】:

我写的代码如下:

        var query = @"SELECT t0.ACT_TYPE, t0.ST_DT,t0.AC_ST_DT  FROM ACTIVITY  t0 WHERE (t0.AC_ST_DT > :p0 OR t0.ST_DT > :p0) AND t0.ACT_TYPE = :p1";
        OracleConnection connection = new OracleConnection(cs);
        try
        {              
            connection.Open();
            OracleCommand cmd = new OracleCommand(query, connection);
            OracleDataAdapter oda = new OracleDataAdapter(cmd);
            OracleParameter pp = new OracleParameter();

            DateTime date = new DateTime(2016, 01, 01);
            OracleParameter dp = new OracleParameter();
            dp.OracleDbType = OracleDbType.Date;
            dp.ParameterName = "p0";
            dp.Value = date;
            cmd.Parameters.Add(dp);

            var sp = new OracleParameter();
            sp.OracleDbType = OracleDbType.Varchar2;
            sp.ParameterName = "p1";
            sp.Value = "SC";
            cmd.Parameters.Add(sp);
            var dt = new DataTable();
            oda.Fill(dt);
            cmd.Dispose();
        }
        finally
        {
            connection.Close();
        }

我得到的错误就像 ORA-01008: 并非所有变量都绑定

谁能帮我解决这个问题。

【问题讨论】:

    标签: c# sql oracle


    【解决方案1】:

    我认为不可能以这种方式重用位置参数。而是使用三个真正的参数,然后绑定它们:

    var query = @"SELECT t0.ACT_TYPE, t0.ST_DT,t0.AC_ST_DT  FROM ACTIVITY  t0 WHERE (t0.AC_ST_DT > :p0 OR t0.ST_DT > :p1) AND t0.ACT_TYPE = :p2";
    OracleConnection connection = new OracleConnection(cs);
    try
    {              
        connection.Open();
        OracleCommand cmd = new OracleCommand(query, connection);
        OracleDataAdapter oda = new OracleDataAdapter(cmd);
        OracleParameter pp = new OracleParameter();
    
        DateTime date = new DateTime(2016, 01, 01);
    
        OracleParameter dp1 = new OracleParameter();
        dp1.OracleDbType = OracleDbType.Date;
        dp1.ParameterName = "p0";
        dp1.Value = date;
        cmd.Parameters.Add(dp1);
    
        OracleParameter dp2 = new OracleParameter();
        dp2.OracleDbType = OracleDbType.Date;
        dp2.ParameterName = "p1";
        dp2.Value = date;
        cmd.Parameters.Add(dp2);
    
        var sp = new OracleParameter();
        sp.OracleDbType = OracleDbType.Varchar2;
        sp.ParameterName = "p2";
        sp.Value = "SC";
        cmd.Parameters.Add(sp);
    
        var dt = new DataTable();
        oda.Fill(dt);
        cmd.Dispose();
    }
    finally
    {
        connection.Close();
    }
    

    【讨论】:

    • 根据this answer 设置cmd.BindByName = true 可能允许原始查询工作。
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2020-05-06
    • 2012-03-01
    • 2011-09-22
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多