4

我正在使用 ODBC 连接来连接到数据库。当我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();
4

5 回答 5

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 文档(第 67 页),我已经能够挖掘出实现了 SQLRowCount 函数。没有以任何方式禁用此功能或任何所需的配置。

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

于 2012-05-29T14:07:58.930 回答
3

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

检查数据库中的版本:

select @@version

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

控制面板 -> 管理工具 -> Microsoft ODBC 源管理器 -> 驱动程序 -> 在此处检查数据库的列版本


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

于 2012-05-30T16:09:07.150 回答
1

OdbcCommand的 MSDN 声明如下:

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

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

更新

或者,正如评论中正确指出的那样,ODBC 驱动程序本身要么存在错误,要么根本不提供此功能(您没有得到您期望的记录数)。

于 2012-05-28T15:24:55.500 回答
1

尝试

ExecuteReader

代替

ExecuteNonQuery 

并在 SQL 语句中通过 select 获取值

于 2012-06-04T11:03:11.177 回答
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();

      }
   }
于 2012-06-04T13:27:51.747 回答