Query在执行时不会添加参数值

时间:2017-11-18 14:32:18

标签: c# sql oracle parameters sql-injection

我想在我的数据库中插入多行,我尝试使用参数但是我做错了。

在调试模式下,参数确实有值,但插入完成后,我的数据库中仍然有@compte@mo@userimp而不是它们的值。

string INSERTDELAMORTPart2 = "'123'," + "'@compte'" + "," + "'@mo'" + "," + "'ubs'" + "," + "'2'" + "," + "'@userimp'" + "," + "'22.10.17'" + ",'";

OdbcCommand Query = new OdbcCommand(INSERTDELAMORTPart2, InfoConnexion); 

Query.Parameters.AddWithValue("@compte", _cb_Compte.SelectedItem);
Query.Parameters.AddWithValue("@mo", MondantResultat);
Query.Parameters.AddWithValue("@userimp", UserImp);

Query.ExecuteNonQuery();

我已尝试过Parameters.Add,还有Parameters["@name"].Value,但结果保持不变。

我做错了什么?

编辑:

我有一个Oracle数据库,我需要单引号来插入我的值。 我试图将我的整个INSERT字符串传递给参数,但它不起作用。

我即将放弃,只需将'替换为'',即使这是一个坏主意。

3 个答案:

答案 0 :(得分:2)

该命令应如下所示:

insert into t(compte, mo, userimp) -- of course the table and columns should be the right names
    values (@compte, @mo, @userimp);

不需要单引号。

我建议不要使用AddWithValue()。相反,要明确类型。

答案 1 :(得分:2)

一些事情。

  1. 如果您使用的是Oracle,我强烈建议您使用ODP.net或托管ODP.net,而不是ODBC。 ODBC 应该工作,但本机驱动程序将更有效地工作,并将避免使用ODBC提供的抽象层时可能遇到的任何奇怪之处。托管ODP.net的另一个优势是不需要在目标计算机上安装Oracle客户端

  2. SQL Server(和其他数据库)使用" @"作为参数,但Oracle使用冒号":"代替。一些数据库(如PostgreSQL)将采用其中一种。虽然SQL中的参数需要冒号,但在.NET中使用赋值参数时,需要省略它。同样,这是Oracle在其他数据库中找不到的东西。

  3. 您的SQL似乎没有任何命令...只有值。你的"插入到哪里?"

  4. 特别是对于Oracle,您希望明确您的数据类型...因此请使用Add而不是AddWithValue(实际上是ODP中Add的重载。净)。或者,您可以稍后设置数据类型。

  5. 转换后的代码看起来像这样:

    string insert = "insert into my_table values (:COMPTE, :MO, :USERIMP)";
    
    using (OracleCommand cmd = new OracleCommand(insert, Connection))
    {
        // no ":" in the parameter declarations
        cmd.Parameters.Add(new OracleParameter("COMPTE", OracleDbType.Int32));
        cmd.Parameters.Add(new OracleParameter("MO", OracleDbType.Varchar2));
        cmd.Parameters.Add(new OracleParameter("USERIMP", OracleDbType.Varchar2));
        cmd.Parameters[0].Value = 123;
        cmd.Parameters[1].Value = "ubs";
        cmd.Parameters[2].Value = "22.10.17";
    
        cmd.ExecuteNonQuery();
    }
    

    我猜测你的数据类型 - 确保它们在实际实现时与你的DDL匹配,如果这些不是唯一的三列,请适当更新你的插入命令。

    如果由于某种原因我误解了,而这不是Oracle,我仍然建议使用本机驱动程序而不是ODBC。当你使用ODBC时,你会对目标机器有很多假设 - 假设可能不是真的。

答案 2 :(得分:1)

你有这个:

string INSERTDELAMORTPart2 = "'123'," + "'@compte'" ...

请注意参数名称周围的单引号。他们不应该在那里。你想要这个:

string INSERTDELAMORTPart2 = "'123'," + "@compte"