我正在使用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();
答案 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();
}
}