2014-06-06 195 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