4

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

試す

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 に答える
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 に答える