ODBC命令不提供插入记录的计数

时间:2012-04-26 20:18:20

标签: c# mysql .net odbc

我正在使用ODBC连接来连接数据库。当我使用insert语句执行OdbcCommand.ExecuteNonQuery时,记录将插入到表中,但该方法返回0.

ExecuteNonQuery返回受影响的记录数。它在删除和更新的情况下工作正常,但在插入时不起作用。

query = "Insert into table1 (field1, field2) values (1,2)";

OdbcConnection = _remoteconn = new OdbcConnection(constring);
OdbcCommand cmd = new OdbcCommand(query, _remoteconn);
recordsAffected = cmd.ExecuteNonQuery();

5 个答案:

答案 0 :(得分:9)

ODBC不是驱动程序 - 它是驱动程序的包装器。这个问题的答案取决于您使用的基础ODBC驱动程序,通常在连接字符串中指定。

MSDN文档实际上是一个期望或建议,但ODBC接口不能强制驱动程序返回特定结果。可能是驱动程序有一些优化或设置干扰了您的结果,与SQL Server NO COUNT设置(这将覆盖驱动程序报告受影响的行的尝试等)不同。

有关ODBC如何工作的更全面说明,请参阅维基百科:
http://en.wikipedia.org/wiki/ODBC

  

“由于不同的技术具有不同的功能,因此大多数ODBC驱动程序都没有实现ODBC标准中定义的所有功能。某些驱动程序提供了标准未定义的额外功能。”

如果您告诉我们您使用的驱动程序,可能有助于找到解决方案。


修改

据我所知,ODBC API函数是SQLRowCount函数,如下所示:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms711835(v=vs.85).aspx

根据ODBC标准,必须实现此功能才能使驱动程序被视为符合ODBC。 (这并不是说函数会返回预期的或正确的结果,只是它就在那里)。

根据Transoft documentation (page 67)我已经能够挖掘出已实现的SQLRowCount函数。没有提及此功能以任何方式被禁用或任何所需的配置。

鉴于上述情况,我会直接与供应商联系。它们的实现或未记录的“功能”似乎存在错误。

答案 1 :(得分:3)

我遇到了类似的问题,因为有问题的数据库的ODBC驱动程序与数据库的版本不同。

使用以下命令检查数据库中的版本:

select @@version

并在ODBC中(至少对于windows xp)位于:

  

控制面板 - >管理工具 - > Microsoft ODBC源   管理员 - >司机 - >在这里查看你的专栏版本   数据库


如果它们不同,那可能就是问题!

答案 2 :(得分:1)

MSDN for OdbcCommand声明如下:

For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command.

你可以发布更多代码吗?你肯定会忘记你得到的数字,没有插入任何记录(!!)

<强>更新

或者,正如评论中正确指出的那样,ODBC驱动程序本身要么被窃听,要么就是没有提供这个功能(你没有给出你期望的记录数。)

答案 3 :(得分:1)

尝试

ExecuteReader

而不是

ExecuteNonQuery 

并使用SQL句子中的select

获取值

答案 4 :(得分:1)

using System;
using System.Data;
using System.Data.Odbc;

   class myOdbc
   {
      static void Main()
      {

      OdbcConnection myOdbcCommandConnection = new OdbcConnection("..."); 

      myOdbcCommandConnection.Open();

      OdbcCommand myOdbcCommand = myOdbcCommandConnection.CreateCommand();

      myOdbcCommand.CommandText = "INSERT INTO table1 (field1, field2) VALUES (?, ?)";

      myOdbcCommand.Parameters.Add("@field1", OdbcType.Int);
      myOdbcCommand.Parameters.Add("@field2", OdbcType.Int);

      myOdbcCommand.Parameters["@field1"].Value = 1;
      myOdbcCommand.Parameters["@field2"].Value = 2;

      Console.WriteLine("Number of Rows Affected is: {0}", myOdbcCommand.ExecuteNonQuery());

      myOdbcCommandConnection.Close();

      Console.ReadKey();

      }
   }