查询在执行时不添加参数值
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"
一些事情。
如果您使用的是 Oracle,我强烈建议您使用 ODP.net 或托管 ODP.net,而不是 ODBC。 ODBC 应该 工作,但本机驱动程序将更有效地工作,并将避免您可能使用 ODBC 提供的抽象层的任何奇怪情况。 Managed ODP.net 具有不需要在目标计算机上安装 Oracle 客户端的额外优势
SQL 服务器(和其他数据库)使用“@”作为参数,但 Oracle 使用冒号“:”代替。一些数据库(如 PostgreSQL)将采用两者之一。虽然 SQL 中的参数需要冒号,但在 .NET 中使用分配参数时需要省略它。同样,这是您在其他数据库中找不到的 Oracle 东西。
您的 SQL 中似乎没有任何命令...只有值。你的"insert into?"
在哪里
特别是对于 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 时,您会假设很多关于目标机器的信息——这些假设可能不正确。
我想在我的数据库中插入多行,我尝试使用参数但我做错了。
在调试模式下,参数确实有值,但是一旦插入完成,我的数据库中仍然有 @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"
一些事情。
如果您使用的是 Oracle,我强烈建议您使用 ODP.net 或托管 ODP.net,而不是 ODBC。 ODBC 应该 工作,但本机驱动程序将更有效地工作,并将避免您可能使用 ODBC 提供的抽象层的任何奇怪情况。 Managed ODP.net 具有不需要在目标计算机上安装 Oracle 客户端的额外优势
SQL 服务器(和其他数据库)使用“@”作为参数,但 Oracle 使用冒号“:”代替。一些数据库(如 PostgreSQL)将采用两者之一。虽然 SQL 中的参数需要冒号,但在 .NET 中使用分配参数时需要省略它。同样,这是您在其他数据库中找不到的 Oracle 东西。
您的 SQL 中似乎没有任何命令...只有值。你的"insert into?"
在哪里
特别是对于 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 时,您会假设很多关于目标机器的信息——这些假设可能不正确。