2012-04-26 38 views
4

我正在使用ODBC连接来连接到数据库。当我用插入语句执行OdbcCommand.ExecuteNonQuery时,记录被插入表中,但方法返回0.ODBC命令不提供插入记录的计数

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

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

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

难道这不是正常的,因为没有记录影响?他们只是刚刚创建... – MarioDS 2012-04-26 20:21:26

+0

但在SQL服务器它给出了插入记录计数。 – 2012-04-26 20:22:36

+0

你能否在你的帖子上添加你的插入语句? – BizApps 2012-04-26 23:00:19

回答

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函数的实现了。没有提到这个功能在任何方面被禁用或任何需要的配置。

鉴于上述情况,我会直接联系供应商。看起来,它们的实施存在错误,或者是无证的“特征”。

+0

我正在使用transoft odbc驱动程序。你能告诉我这种情况下的行为吗? – 2012-06-04 04:02:41

+0

@Romil - 不幸的是,我没有与该供应商的经验。但它听起来像是有驱动程序连接到许多不同的数据源。您可能需要查看其网站上的文档,以了解您正在使用的特定驱动程序(看起来像文档可以在这里找到:http://www.transoft.com/support/product-knowledgebase.aspx) – JDB 2012-06-04 13:35:52

+0

这应该是真正的接受的答案 – Alex 2012-06-05 06:47:51

1

MSDN for OdbcCommand规定如下:

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

你可以发布更多的代码?你肯定无法追踪数量的你,没有记录被插入(!!)

UPDATE

或者,如评论正确地指出,ODBC驱动程序本身无论是窃听还是根本不提供此功能(您没有得到您期望的记录数)。

+0

MSDN文档具有误导性。作者过于乐观,认为所有或绝大多数ODBC驱动程序实现将全面实施所有建议。实际上很少有司机实施所有建议。 Romil的代码“几乎可以肯定”出错的说法太强大了 - 没有足够的证据来提供诊断问题。 – JDB 2012-05-29 19:14:03

+0

编辑为包含“驱动程序被窃听”选项(没有考虑它)并且改写 – Alex 2012-05-30 06:46:31

+0

驱动程序可能被窃听。但是,我们不知道他连接的数据源是什么,所以它可能不是一个错误,而是一个功能。也许计算插入的记录会产生大量开销,并且驱动程序已禁用此功能以支持响应。甚至可以通过配置文件打开和关闭记录计数。在我们知道使用哪个驱动程序之前,真的不知道问题是什么。 – JDB 2012-05-30 13:12:59

3

我有一个类似的问题,这是因为有问题的数据库的ODBC驱动程序与数据库有不同的版本。 >管理工具 - - >微软ODBC数据源

控制面板:在

select @@version 

,并在ODBC(至少对于Windows XP):

检查版本的数据库管理员 - >驱动程序 - >这里检查你的列版本 数据库


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

+1

+1对于一个有趣的点我不知道 – Alex 2012-06-05 06:44:08

1

尝试

ExecuteReader 

代替

ExecuteNonQuery 

,并用选择获得价值在SQL语句

+0

我在做INSERT,所以如何使用ExecuteReader进行插入。 – 2012-06-04 13:29:25

+0

执行INSERT,然后选择更改或使用存储过程。 – drzymala 2012-06-04 14:50:08

+0

我的问题是,为什么我没有得到只有插入语句ExecuteNonQuery计数。 – 2012-06-04 14:52:32

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(); 

     } 
    } 
+0

我的代码正在将数据插入到数据库中,但问题是我没有计数。 – 2012-06-04 13:30:12

+0

我得到两个插入完成和正确的计数:) – 2012-06-04 13:36:34

+0

我得到更新记录的计数,但不是插入的记录。 – 2012-06-04 13:37:39