2014-06-06 151 views
1

我得到这个错误“ORA-01722:非法/无效号码”甲骨文插入查询

  decimal first2var = Convert.ToDecimal(var1); 
      decimal id_refeicao; 

      //... 
      // save values in var insted of lables 
      decimal id_usuario = (decimal)dr.GetInt32(0); 
      //... 
      var idUsuarioParameter = new OracleParameter 
      { 
       ParameterName = "id_usuario", 
       OracleDbType = OracleDbType.Decimal, 
       Direction = ParameterDirection.Input, 
       Value = id_usuario 
      }; 
      var idRefeicaoParameter = new OracleParameter 
      { 
       ParameterName = "id_refeicao", 
       OracleDbType = OracleDbType.Decimal, 
       Direction = ParameterDirection.Input, 
       Value = id_refeicao 
      }; 
      var var1Parameter = new OracleParameter 
      { 
       ParameterName = "first2var", 
       OracleDbType = OracleDbType.Decimal, //-- populate with correct oracle type 
       Direction = ParameterDirection.Input, 
       Value = first2var 
      }; 
       OracleConnection connection = new OracleConnection(oradb); 
       connection.Open(); 
       cmd.Connection = connection; 
       cmd.CommandText = "INSERT INTO SER_REFEICAO_USUARIO (USUARIO, REFEICAO, DATA_HORA, ORIGEM) VALUES(:id_usuario, :id_refeicao, SYSDATE , :first2var)"; 
       cmd.Parameters.Add(idUsuarioParameter); 
       cmd.Parameters.Add(idRefeicaoParameter); 
       cmd.Parameters.Add(var1Parameter); 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
       connection.Close(); 

谁能帮我什么,我做错了,如果我硬代码我在我的插入查询值,它工作正常,但如果我通过上面的参数,所以我得到了错误。

+0

你为什么在你的命令tex里有'var2',但是添加'var1'作为参数?另外,是数字或字符串? –

+0

@DanielKelley ID是数字,但我定义了数据类型字符串,像这样“字符串id_usuario” – user2956373

+0

表SERCREFEICAO_USUARIO'的定义怎么样,你能告诉我们每个列是什么类型? –

回答

1

根据这一source,应忽略从参数名称:,所以它应该是这样的:

cmd.Parameters.Add("id_usuario", id_usuario); 
cmd.Parameters.Add("id_refeicao", id_refeicao); 
cmd.Parameters.Add("var1", var1); 

此外,如在评论中提到的,你有你的查询文本之间的不匹配:

INSERT INTO SER_REFEICAO_USUARIO (USUARIO, REFEICAO, DATA_HORA, ORIGEM) 
VALUES(:id_usuario, :id_refeicao, SYSDATE, :var2) 

而且你的参数声明:

cmd.Parameters.Add("var1", var1); 
+0

为什么添加参数句点如果是内嵌SQL?您只能格式化字符串。 – alykins

+1

@alykins,因为这会打开你的SQL注入,正如在你的答案的评论中提到的。 –

+0

@alykins因为它会打开OP到SQL注入攻击。在推广一个糟糕的主意之前,你真的需要了解他们。 –

0

我假设你使用ODP.NET。根据我的经验,我总是必须指定OracleDbType.Decimal,因为Oracle不喜欢byte,int或long。另一个问题是我们没有将OracleDbType与参数一起传递,因此ODP.NET看到您传递了一个字符串,并且可能说该参数的类型是字符串,而不是您想要的类型。再加上Sven Grosen的回答应该为你做。你最终得到的东西如下:

decimal id_usuario = (decimal)dr.GetInt32(0); 
decimal id_refeicao = (decimal)dtre.GetInt32(0); 
var idUsuarioParameter = new OracleParameter 
{ 
    ParameterName = "id_usuario", 
    OracelDbType = OracleDbType.Decimal, 
    Direction = ParameterDirection.Input, 
    Value = id_usuario 
}; 
var idRefeicaoParameter = new OracleParameter 
{ 
    ParameterName = "id_refeicao", 
    OracelDbType = OracleDbType.Decimal, 
    Direction = ParameterDirection.Input, 
    Value = id_refeicao 
};  
var var1Parameter = new OracleParameter 
{ 
    ParameterName = "var1", 
    //OracelDbType = OracleDbType.Decimal, -- populate with correct oracle type 
    Direction = ParameterDirection.Input, 
    Value = var1 
}; 


connection.Open(); 
cmd.Connection = connection; 
cmd.CommandText = "INSERT INTO SER_REFEICAO_USUARIO (USUARIO, REFEICAO, DATA_HORA, ORIGEM) VALUES(:id_usuario, :id_refeicao, SYSDATE, :var1)"; 
cmd.Parameters.Add(idUsuarioParameter); 
cmd.Parameters.Add(idRefeicaoParameter); 
cmd.Parameters.Add(var1Parameter); 
cmd.CommandType = CommandType.Text; 
cmd.ExecuteNonQuery(); 
connection.Close(); 

我认为应该为你做。注意:未经测试/未编译的代码。

+0

我试过你上面提到的方式,但我仍然收到错误“ORA-01036非法变量名称/编号”.. – user2956373

+0

另一件事我不能把OracleDbType。小数点,它不接受这个线 – user2956373

+0

我已经更新了代码,在将它们添加到cmd.Parameters集合之前显式创建OracleParameter类型。这里的重要部分是我们告诉Oracle我们使用的是什么类型。 – mhand