查询在执行时不添加参数值

Query doesn't add parameters' value when executed

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

在调试模式下,参数确实有值,但是一旦插入完成,我的数据库中仍然有 @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 字符串传递给一个参数,但它不起作用。

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

该命令应如下所示:

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

不需要单引号。

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

你有这个:

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

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

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

一些事情。

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

  2. SQL 服务器(和其他数据库)使用“@”作为参数,但 Oracle 使用冒号“:”代替。一些数据库(如 PostgreSQL)将采用两者之一。虽然 SQL 中的参数需要冒号,但在 .NET 中使用分配参数时需要省略它。同样,这是您在其他数据库中找不到的 Oracle 东西。

  3. 您的 SQL 中似乎没有任何命令...只有值。你的"insert into?"

  4. 在哪里
  5. 特别是对于 Oracle,您希望明确说明您的数据类型...因此请使用 Add 而不是 AddWithValue(这实际上是 [=11= 的重载) ] 在 ODP.net)。或者,您可以稍后设置数据类型。

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

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 时,您会假设很多关于目标机器的信息——这些假设可能不正确。