【问题标题】:Oracle.DataAccess.Client.OracleException ORA-01008: not all variables bound at Oracle.DataAccess.ClientOracle.DataAccess.Client.OracleException ORA-01008:并非所有变量都绑定在 Oracle.DataAccess.Client
【发布时间】:2014-01-29 16:21:22
【问题描述】:

我遇到了这个错误,我无法解释:

Oracle.DataAccess.Client.OracleException ORA-01008:并非所有变量 绑定在 Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode、OracleConnection conn、IntPtr opsErrCtx、OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(布尔重新查询, Boolean fillRequest,CommandBehavior 行为)在 Oracle.DataAccess.Client.OracleCommand.ExecuteReader() 在 gestao.GestaoDefault.GeraSqlDataSourceDropDownDisciplinasSelectCommand(Int32 选择值)在 c:\inetpub\MiniSites\inscricoes\gestao\Default.aspx.cs:501 行

我的查询:

SELECT DISTINCT
       cse.t_tbdiscip.cd_discip,
       cse.t_tbdiscip.ds_discip
  FROM cse.t_tbdiscip, cse.t_turma, cse.t_plandisc
 WHERE cse.t_plandisc.cd_curso = :CD_CURSO
   AND cse.t_turma.cd_curso = :CD_CURSO
   AND cse.t_plandisc.cd_activa = 'S'
   AND cse.t_turma.estado = 'S'
   AND cse.t_tbdiscip.cd_discip = cse.t_plandisc.cd_discip
   AND cse.t_tbdiscip.cd_discip = cse.t_turma.cd_discip
   AND cse.t_turma.cd_a_s_cur IS NOT NULL
   AND cse.t_turma.cd_lectivo = :CD_LECTIVO
 ORDER BY cse.t_tbdiscip.ds_discip

如您所见,我必须对查询进行 vars。 我的代码:

OracleConnection oracleSqlConnection = new OracleConnection(ConOracleString);
try
{
    // Just to see if any value is passed to the query
    LiteralMensagens.Text += String.Format("Curso : " + curso + "<br /><br />");
    LiteralMensagens.Text += String.Format("Lectivo : " + lectivo + "<br /><br />");
    LiteralMensagens.Text += String.Format("query : " + query + "<br /><br />");

    oracleSqlConnection.Open();
    OracleCommand cmdOracle = new OracleCommand(query, oracleSqlConnection);
    cmdOracle.CommandType = CommandType.Text;

    cmdOracle.Parameters.Clear();
    cmdOracle.Parameters.Add(":CD_CURSO", OracleDbType.Decimal).Value = curso;
    cmdOracle.Parameters.Add(":CD_LECTIVO", OracleDbType.Varchar2).Value = lectivo;

    OracleDataReader oracleDataReader = cmdOracle.ExecuteReader();
    while (oracleDataReader.Read())
    {
        LiteralMensagens.Text += string.Format((String)oracleDataReader["DS_DISCIP"]);
    }
}
catch (Exception ex)
{

从我的代码中我绑定了我的变量。

来自 Oracle 数据库:

CD_LECTIVO-VARCHAR2(7)

CD_CURSO-NUMBER(4)

我在这里检查过,我认为我使用了正确的类型http://msdn.microsoft.com/en-us/library/yk72thhd.aspx

有什么问题?

【问题讨论】:

    标签: c# asp.net oracle


    【解决方案1】:

    问题解决了... 添加了这个:

    cmd.BindByName = true;
    

    发现这篇文章:similar issue on stackoverflow

    【讨论】:

      【解决方案2】:

      您应该像这样更改您的代码(从参数名称中省略':'):

      // ...
      cmdOracle.Parameters.Add("CD_CURSO", OracleDbType.Decimal).Value = curso;
      cmdOracle.Parameters.Add("CD_LECTIVO", OracleDbType.Varchar2).Value = lectivo;
      //...
      

      【讨论】:

        【解决方案3】:

        现在仍然无法正常工作,真的很奇怪...我绑定了 2 个变量,如果我评论其中一个并在查询中插入值(不是女巫一个),它可以完美地工作... cmdOracle.Parameters.Add 不接受超过 1 个值...这对任何人都有意义吗?

        这可以用查询字符串上的 var 替换 ":CURSO":

        String query = String.Format("SELECT DISTINCT CSE.T_TBDISCIP.CD_DISCIP, CSE.T_TBDISCIP.DS_DISCIP " +
        "FROM CSE.T_TBDISCIP, CSE.T_TURMA, CSE.T_PLANDISC " +
        "WHERE (CSE.T_PLANDISC.CD_CURSO = " + curso + ") " +
        "AND (CSE.T_TURMA.CD_CURSO = " + curso + ") " +
        "AND (CSE.T_PLANDISC.CD_ACTIVA='S') " +
        "AND (CSE.T_TURMA.ESTADO='S') " +
        "AND (CSE.T_TBDISCIP.CD_DISCIP=CSE.T_PLANDISC.CD_DISCIP) " +
        "AND (CSE.T_TBDISCIP.CD_DISCIP=CSE.T_TURMA.CD_DISCIP) " +
        "AND (CSE.T_TURMA.CD_A_S_CUR IS NOT NULL) " +
        "AND (CSE.T_TURMA.CD_LECTIVO = :CD_LECTIVO) " +
        "ORDER BY CSE.T_TBDISCIP.DS_DISCIP");
        

        【讨论】:

          猜你喜欢
          • 2021-12-11
          • 1970-01-01
          • 2011-09-22
          • 2021-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          • 2020-05-06
          相关资源
          最近更新 更多