• ベストアンサー

VB+SQLserverでRecordCount問題

こんばんわ。 VBでMSのSQLサーバに接続しデータをコピーするメンテナンスツールを作っています。 通常、レコードカウントを取得できますが、主キーが設定されていないテーブルの場合、RecordCountが「-1」になります。 このテーブルに主キーを設定しますとちゃんと取得します。 主キーが設定されていない状態で正確にRecordCountを取得する方法はないんでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#5584
noname#5584
回答No.2

使用するOLEDBプロバイダにより、カーソルロケーションが adUseServer ではRecordCountプロパティが正しい値を返さない場合があるはずです。 この場合、adUseClient とすれば、正しい件数を取得できると思います。 しかし、そもそも、件数を取得するだけなら、SQLの集計関数を使用し、 SELCT COUNT (*) としたほうが、オーバーヘッドがはるかに少なくて済みます。 ですので、レコードセットのRecordCountプロパティを参照する方法は一般に推奨されません。 ( DAO.Recordsetの場合、MoveLastしないと、RecordCountプロパティで正しい件数を取得できない、という問題もあります )

zenon55
質問者

お礼

こんばんは。 SELCT COUNT (*)でやりました。 アドバイスを元にいろいろやってみましたがこの方法が一番スマートに思えました。 有難う御座いました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

自分もこのような現象に悩んだことがあります。 確か,DAOで書いていたものをADOに書き換えた際におこりました。 そのときは,主キーのことまでは頭が回らずに,ORDER BYでソートするとカウントされる場合もありましたが,件数が取得できたり,できなかったり,まちまちなので,結局,レコードセットを全て読んで,変数に件数を入れて件数を取得するという方法を使いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLServerにおける、排他制御に関して質問です。

    SQLServerにおける、排他制御に関して質問です。 環境:  SQLサーバ  ・Windows 2003 Server SP2  ・SQL Server 2005 Standard Edition SP3  SQLクライアント  ・WindowsXP SP3  ・.NET Framework 3.5 SP1 VB.NET アプリ  DBアクセサ  ・ADO.NETを利用 ---------------------------------------------------------------------- 1.DBとのコネクションを確立        ・        ・        ・ 2.データベーストランザクションを開始(レベルはSerializable) 3.テーブルAに対してINSERTを実行   (テーブルAの主キーはオートインクリメント設定されている。) 4.3の結果、追加された主キーを取得するため、MAX()関数にて主キーの最大値(つまり、3で追加した行のはず)を取得 5.テーブルAを外部参照しているテーブルに対して、4で取得したテーブルAのキーを利用して、行を追加・更新などを行う。 6.コミットを行う。   (コネクションは、アプリケーションが終了するまで保持する・・・) ---------------------------------------------------------------------- この処理フローで実行していたシステムですが、 二つのクライアント(X,Y)から、同時に2からの処理が行われた際に排他されず、 Xが、Yが作成したレコードの主キー値を元に、5の更新を行ってしまいました。 ログを見ると、 2→成功 3→成功(別のレコードが作成された) 4→XがMAX関数にて、Yが作成したレコードの主キーを取得   ※処理そのものは成功しているが、論理的におかしい となっています。 論理的には、トランザクションをかけているので、3からの処理が同時に行われるはずはなく、 4で取得される番号も、それぞれが作成した行の主キー番号になるはずなのですが・・・。 論理的に見落としている点や、環境的な要因などで、考えられる原因はありますでしょうか・・・?

  • RecordCount(ADO)が変わる?ADP+SQLServer

    ACCESS2000(ADP)+SQLServerにて作成したものですが、 あるクライアント(1台)だけRecordCountがおかしいのです。 <フォームAのボタンクリック時の処理> DoCmd.OpenForm "フォームB", , , , , , Me!コード <フォームBの読み込み時の処理> Dim rs AS ADODB.Recordset Set rs = Me.RecordsetClone rs.Find "コード=" & Me.OpenArgs, 0, adSearchForward If not rs.EOF then Me.Bookmark = rs.Bookmark End if 問題のないクライアント(他の2台)では、 フォームBにてOpenArgに指定したコードが検索され, 該当のレコードが表示されます。 問題のクライアントでは、 「一部」のレコードを指定した場合にレコードが検索されず、 最初のレコードが表示されました。 原因を調べているうちに分かったことは、 Set rs = Me.RecordsetClone で取得したレコードセットがあるタイミングでは、 一部かけた状態になっているということです。 その際に使用した方法は、 Set rs = Me.RecordsetClone rs.MoveLast MsgBox rs.RecordCount MsgBox rs.RecordCount としてレコードの件数を調べて判明しました。 MsgBox rs.RecordCountが2つあるのは記述ミスではありません。 該当のテーブル(レコード)は757件ありますが、 問題のないクライアントでは2回ともに757を返します。 問題のクライアントでは、 1回目のRecordCountは500 2回目のRecordCountは757を返してきます。 しかも、何回も実行していると 1回目が400、450、500とランダムで変化します。 (500が2回続いたりするときもあります) 以上のことから、考えられる原因は何かありますでしょうか。 よろしくお願いいたします。

  • VB2005からSQLServer2005への接続

    VB2005とSQLServer2005のどちらも製品版をインストールしました。 VB2005よりサーバエクスプローラから接続の追加により自分で作成したテーブルに接続を試みたところ、 以下のようなエラーが発生し接続できません。 (エラー内容)サーバーへの接続を確立しているときにエラーが発生しました。SQL Server2005に接続しているときにこのエラーが発生した場合は、SQL Serverの既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。(provider:共有メモリ プロバイダ,error:40-SQL Serverへの接続を開けませんでした) なにかSQLServer側の設定を変更しないと接続できないのでしょうか? どなたかアドバイスお願いします<(_ _)>

  • RecordCount プロパティ

    ASP+Access2003+ADODB接続 という環境で開発をしております。 StrSQL = "select count(*) from table" Open.StrSQL, conn xRecount = StrSQL(0) とすれば、単純に取得することはできますが、 SQL自体がカウント集計の結果の場合、 その集計結果のレコード件数を取得したいと思ったのですが、よく分かりません。 例えば、 select fDate, count(*). from tTable where fDate >= '2006-08-01' group by fDate のようなSQLの結果の件数です。 8月1日以降のデータの件数を返したときに、 その結果 8/1 10件 8/2 0件 8/3 3件 となれば2が欲しく 8/1 0件 8/2 0件 8/3 0件 となれば0が欲しいわけです。 どうすれば取得できるでしょうか? よろしくお願い致します。 ちなみに・・・ SQLServerの環境においては、 StrSQL = "select * from table" Open.StrSQL, conn xRecount = StrSQL.RecordCount で取得できるのですが、ACCESSだとダメのようです。

  • SQLserver2000でプライマリーキーの設定でのエラー

    こんばんわ。 現在SQLの勉強をSQLserver2000でしているのですが、 SQL Enterprise Managerを使って、ある列に主キーを定義しようとして、鍵マークをつけて、保存しようとすると 以下のようなエラーがでて設定できません。 テーブル 'xxxxx' - インデックス 'PK_xxxxx' を作成できません。 ODBC エラー : [Microsoft][ODBC SQL Server Driver][SQL Server]インデックス ID 1 で重複したキーが見つかったので、CREATE UNIQUE INDEX は終了しました。もっとも重要な主キーは 'yyyyy ' です。 [Microsoft][ODBC SQL Server Driver][SQL Server]制約を作成できませんでした。以前のエラーを調べてください。 [Microsoft][ODBC SQL Server Driver][SQL Server]ステートメントは終了されました。 初心者なので、このエラーの意味するところが理解できません。 なにが間違っているのでしょうか。 よろしくお願いします。

  • VB2005よりSQLServer2005への接続

    VB2005 Express版とSQL Server 2005製品版をインストールしました。 VB2005のデータベースエクスプローラよりデータベースの追加で 作成済みのSQLデータベースに接続しようとした所以下のエラーメッセージが出て接続出来ません。  ちなみに、メッセージの出ているリモート接続は確認しました。  リモート接続(TCP/IP及び名前付きパイプを使用する。) (エラーメッセージ) サーバーへの接続を確立している時にエラーが発生しました。SQL Server 2005に接続している時にこのエラーが発生した場合はSQL Serverの既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。(provider:SQLネットワークインターフェイス,,error:26 - 指定されたサーバー又はインスタンスの位置を特定しているときにエラーが発生しました) どなたか、解決の為のアドバイスを下さい。 当方、VBおよびSQLも今回初めて使用します。  

  • VBでSQL

    SQLでテーブル1に該当レコードがなければインサート あればアップデートをする処理をしたいのです IF ??? THEN UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件 ELSE INSERT INTO テーブル1(SELECT * FROM テーブル2) END IF ???はプライマリキーで判定をしようと考えています こんな感じでやろうとしたところ うまくいきませんでした VB上で実行しよううとしているからなのでしょうか? ADOでSQLサーバに接続しています 条件分岐もどういう条件(VBでの書き方)がわからないです。 よろしくお願いします。

  • SQLServerで・・・

    SQLを発行してデータ取得したいと考えています。 テーブルの構成は 名前 varchar(512) アクセス日付 datetime(8) 住所 varchar(512) の3つの項目です。 ここで日にちごとにアクセスした人をカウントしたいと考えています。 アクセス日付には 2002-12-24 19:10:20:17.00 2002-12-25 15:11:01:21.00 2002-12-25 09:25:20:08.00 2002-12-26 21:10:20:17.00 というフォーマット(デフォルト?)で格納されています。 この場合、2002年12月25日にアクセスした人をカウントする SQLを書きたいのですが、どのようにすればいいのでしょうか? select 名前, アクセス日付, 住所 from テーブル where アクセス日付 = '???'; 実際にSQLを発行できる環境があればいいのですが、 宜しくお願いいたします。

  • ADOのレコードセットをローカルにキャッシュする方法

    ご質問させて頂きます。 MS SQL 2000 と VB 6.0 の環境で、ADO接続しています。 SQLサーバに接続し、データをレコードセットに取得したのですが、Connectionをクローズするとレコードセットも参照できなくなってしまいます。 Connectionをクローズ後もレコードセットを使えるようにする方法はありませんでしょうか? どうぞ宜しくお願いします。

  • SQLServerを使い、SQL文の練習をしたい

    SQLServerを使い、SQL文記述の 練習をしたいと考えています。 (テーブルを作る、結合させる、レコードの合計を出す、などの内容) 自分のPC上で、SQL文を書いて 「わー2つのテーブルが結合した!」 「こっちのテーブルにはないレコードだけを追加できた!」というようなことを実感したいのみなのですが、この目的での利用でも、レンタルサーバーを借りるなどして「サーバー」を準備する必要があるのでしょうか? AccessでSQL文の面白さを知り、 他のデータベース関係のソフトにも触れてみたいと 思ったのが理由です。 よろしくお願いいたします。