C# Oracle插入查询

C# Oracle插入查询,c#,oracle10g,C#,Oracle10g,我收到错误“ORA-01722:非法/无效号码” 有谁能帮我指出我做错了什么,如果我在insert查询中硬编码我的值,它可以正常工作,但是如果我像上面那样传递参数,那么我就得到了错误。根据这一点,你应该从参数名中省略:,所以应该是这样的: cmd.Parameters.Add("id_usuario", id_usuario); cmd.Parameters.Add("id_refeicao", id_refeicao); cmd.Parameters.Add("var1", var1); 此

我收到错误“ORA-01722:非法/无效号码”

有谁能帮我指出我做错了什么,如果我在insert查询中硬编码我的值,它可以正常工作,但是如果我像上面那样传递参数,那么我就得到了错误。

根据这一点,你应该从参数名中省略
,所以应该是这样的:

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);

我假设您正在使用ODP.NET。根据我的经验,我总是必须指定OracleDbType.Decimal,因为出于某种原因,Oracle不喜欢byte、int或long。另一个问题是,我们没有将OracleDbType与参数一起传递,因此ODP.NET看到您传递了一个字符串,可能是说参数的类型为string,而不是您想要的类型。这再加上斯文·格罗森的回答,应该能帮到你。您将得到如下结果:

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();

我想这应该对你有好处。注意:未测试/未编译的代码。

为什么命令tex中有
var2
,但添加
var1
作为参数?此外,id是数字还是字符串?@DanielKelley id是数字,但我在其中定义了数据类型字符串,如“字符串id\u usuario”表
SER\u REFEICAO\u usuario
的定义,您能告诉我们每个列的类型吗?谢谢。我发现了问题,问题是,我没有定义OracleCommand(),所以它接受旧值并在查询中使用旧值。如果是内联SQL,为什么要添加参数?您只需格式化字符串即可。@alykins,因为这会使您面临SQL注入攻击,正如您回答中的评论所述。@alykins,因为这会使OP面临SQL注入攻击。在推广一个坏主意之前,你真的需要了解它们。我想我不明白的是,如果我有一个SQL注入剪报,我通过参数添加它,这和内联添加它不一样吗?调用的不是存储过程,而是内联SQL。它已经可以注入了,不是吗?谷歌是你的朋友-通过评论讨论这个问题是毫无意义的。我尝试了你上面提到的方法,但仍然得到错误“ORA-01036非法变量名/数”。另一件事我不能把OracleDbType.Decimal,在这一行它不接受这一点。在将OracleParameter类型添加到cmd.Parameters集合之前,我已更新代码以显式创建它们。这里最重要的部分是我们要告诉Oracle我们使用的是什么类型。你能给我你的id吗?我想和你讨论一下整个代码及其逻辑。。Thankso不提供用户对用户的消息传递方式,我们可以在这里讨论,或者你可以打开一个新问题并链接到这里,我可以回答。这样,找到这篇文章的其他人也会得到你问题的答案。
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();