AccessDBへのInsertとSelectタイミングについて

このQ&Aのポイント
  • 現在.NET Framework 3.5にて業務アプリを開発しています。主にデータベース編集を目的としたアプリです。(DBはAccess2000)Insert/Deleteについては、データソース接続し、TableAdapterのクエリを利用しています。Selectについては、Microsoft.Jet.OLEDB.4.0経由で取得しています。このような条件で、Insert/Delete処理を行った直後にSelect処理でデータを取得すると、Insert/Deleteが反映されていないデータが取得されてしまいます。
  • InsertとSelectのタイミングに関する問題です。現在、.NET Framework 3.5で開発している業務アプリでは、データベース編集が主な目的です。使用しているデータベースはAccess2000です。Insert/Delete処理では、データソースに接続し、TableAdapterのクエリを使用しています。一方、Select処理では、Microsoft.Jet.OLEDB.4.0を経由してデータを取得しています。しかし、Insert/Delete処理の直後にSelect処理を行うと、反映されていないデータが取得されてしまいます。
  • AccessDBへのInsertとSelectのタイミングに関する問題です。私は現在.NET Framework 3.5を使用して業務アプリを開発しています。このアプリケーションは主にデータベース編集を目的としており、データベースはAccess2000を使用しています。Insert/Delete処理では、データソースに接続し、TableAdapterのクエリを使用しています。一方、Select処理では、Microsoft.Jet.OLEDB.4.0を通じてデータを取得しています。しかし、Insert/Delete処理後に直ちにSelect処理を行うと、反映されていないデータが取得されてしまいます。これを回避する方法はありますか?
回答を見る
  • ベストアンサー

AccessDBへのInsertとSelectタイミングについて

AccessDBへのInsertとSelectタイミングについて 現在.NET Framework 3.5にて業務アプリを開発しています。 主にデータベース編集を目的としたアプリです。(DBはAccess2000) Insert/Deleteについては、データソース接続し、TableAdapterのクエリを利用しています。 Selectについては、Microsoft.Jet.OLEDB.4.0経由で取得しています。 このような条件で、Insert/Delete処理を行った直後にSelect処理でデータを取得 すると、Insert/Deleteが反映されていないデータが取得されてしまいます。 これを回避する方法を教えてください。 (非常に低レベルな質問かと思いますが、何卒よろしくお願い致します。)

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

>Insert/DeleteもTableAdpterのCommand経由ではなく、 >OLEDBのCommandで >行ってみては?という内容で間違いないでしょうか? そうです。本来はこういう場合はトランザクション処理 をして、データの出し入れに矛盾をきたさないように するのですが。あまり、その場しのぎはよくないのでは。 トランザクション処理となると少しプログラムが追加 になりますが、 >かなり改修規模が大きくなってしまうので ということであれば、あれもこれもとお勧めするのは 躊躇します。

5dogs_fuji
質問者

お礼

回答ありがとうございます。 やはりトランザクション処理はすべきですね。 まずはプロトタイプリリースを優先させるべく、一度接続を解除する方法で 回避しました。 正式リリース時には根本解決の為、トランザクション処理を追加して行きます。 的確なアドバイスありがとうございました。

その他の回答 (2)

回答No.2

次の2つの方法でお試しください. (1)Insert/Delete処理を行った直後 ... connForInsert.Close(); connForInsert = null; //新しい接続Forクエリ connForSelect = new System.Data.OleDb.OleDbConnection(strConn); ... (2)Insert/Delete処理を行った直後 .... //insert処理 System.Threading.Thread.Sleep(500); .... //Select処理 ご参照ください。

参考URL:
http://www.werunsoft.com/tips.aspx?db=access&id=80
5dogs_fuji
質問者

お礼

ご回答ありがとうございます。 いろいろなサイトを調べたところ、OLEDB接続を一度閉じ再度オープンし対応している方がいました。 両方試しまして、結果を報告したいと思います。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

Commndオブジェクトを使って、SQL文(Insert/Delete)を 指定して、Executeした後、Select処理したらどうなりますか。

5dogs_fuji
質問者

お礼

早速の回答ありがとうございます。 Insert/DeleteもTableAdpterのCommand経由ではなく、OLEDBのCommandで 行ってみては?という内容で間違いないでしょうか? かなり改修規模が大きくなってしまうので、確認でき次第報告します。

関連するQ&A

  • 「SELECTして取得できない場合、INSERT」の不完全さの改善

    はじめまして。 ユニークキー設定しているカラムに、 SELECTして取得できない場合、INSERTの処理をすると 違うセッションでタイミングによってINSERTがエラーになってしまうと思います。(以下参照) -------------------------------------- 時間  SESSION1     SESSION2 ↓    SELECT→× ↓                SELECT→× ↓    INSERT→○ ↓                INSERT→× -------------------------------------- この様な場合、SESSION2を生かすには、その後SELECTを再度実行すればよいと思うのですが、他によい方法はないのでしょうか? 何かございましたら、ご教授お願いいたします。 各バージョン MySQL5.0 (PHP5.1)

  • インサート処理のスピード

    n件のデータを (1)SELECT INSERTで処理するのと、 (2)SELECT文をカーソルループにして1件ずつINSERTするのでは 処理時間は結構違うのでしょうか? 手元に実行環境がないためご存知の方がいらっしゃったらご教授下さい。 (SQLSERVERかORACLEかなどは問いませんので)

  • AUTO_INCREMENT の値をINSERT前に知りたい

    PHP(PEAR)+MYSQLでWEBアプリを作成しているのですが、AUTO_INCREMENTを設定した値をデータのINSERTを行う前に取得したいのですが、どのようにすればいいのでしょうか?INSERT後であればLAST_INSERT_ID()やmysql_insert_id()で取得できるのは分かっているのですが…。ちなみに現在のテーブル型はInnoDBです。MySQLもしくはPearの命令でお分かりになる方お教えください。よろしくお願いします。

  • SELECT実行中にINSERTしたい

    テーブルTに対し、データ抽出に数分かかるようなSELECT文を実行しているとして、 そのSELECT文の実行中にInsertしたらどのような挙動になるでしょうか。 (INSERTした瞬間にエラーが発生する?) また、SELECT文の実行中にInsertしたら、 「SELECT文が実行終了するまで待って、そのあとにINSERTする」 という動きにしたい場合、どのように設定(or SQLを書けば?)すればよいでしょうか。

    • ベストアンサー
    • MySQL
  • DBへのinsert後のid(auto_increment)の取得

    お世話になってます。質問ばかりで恐縮ですが、お知恵をお借りしたく投函させて頂きます。 mysql_connect('localhost','root','******'); mysql_select_db('test'); $hiduke = date("y-m-d"); $sql = "insert into test_tb values(0, '$hiduke', …)";//0はフィールド名id(auto_increment属性) mysql_query($sql); 上記のようなコードにて、MySQLへデータをinsertしているのですが、このとき、auto_increment属性を持ったフィールド名(id)の番号を取得するには、どのようなコードになるのでしょうか? http://dev.mysql.com/doc/refman/4.1/ja/odbc-and-last-insert-id.html 上記マニュアルに、SELECT LAST_INSERT_ID()を使うと説明がありますが、実際のコード(PHPスクリプト)にするところまで結びつける事が出来ません。 id番号を取得し、その番号をセッションに代入させたいのです。 初歩的な質問ばかりと、お恥ずかしい限りですが、アドバイスのほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • バルクINSERT直後に、最後のIncremet値は取得できますか?

    PHPからMySQLへトランザクションを使わずに、 INSERT INTO test (id,count) VALUES (5,5),(6,6) のようにINSERTした直後に、SELECT LAST_INSERT_ID(); としても、5が返却されてしまいます。 これはMySQLの仕様でしょうか? 又、 SELECT LAST_INSERT_ID() ではなく、 SELECT LAST_INSERT_ID() FROM test; のようにテーブル名を指定する方法は何か意味があるのでしょうか? テーブル名を指定すると、テーブルにあるレコード数分 データが返却されてしまいました。。

    • ベストアンサー
    • MySQL
  • [ADO.NET]Accessの日付型にデータをInsertするには?

    言語はVB.NETでDBはAccess2003、OleDbで接続をしています。 テーブルに日付型のフィールドがあるのですが、 SQL文でInsertしようとすると、 System.Data.OleDb.OleDbException: 更新可能なクエリであることが必要です。 という例外がスローされます。 SQL文としては、 INSERT INTO TEST_TABLE (name,updatetime) VALUES ('テスト',DateValue('2006/12/11 18:00:00')); というような構文になっています。 初歩的な不明点ですが、ご教授お願いします。

  • select→OK insert→NG

    ASP(VBSCRIPT)で、ACCESSに接続するプログラムを作成しています。Microsoft JET Database Engine を利用してACCESSに接続したいのですが、SQL文のinsert及びupdateの時は、以下エラーメッセージがでてうまくいきません。但し、SELECT及びDELETEはうまくいきます。 セキュリティの問題だと思うのですが、何か分かれば教えてください。 環境  IIS4.0  WINNT4.0 SP6     MSG  Microsoft JET Database Engine エラー '80040e14' UPDATE ステートメントの構文エラーです。

  • delete⇒insert

    web開発の現場にて、 既存データの更新処理を行うとき、 (1)update (2)delete⇒insert というように2パターンを見かけます。 (1)と(2)の違いあるのでしょうか、 また、どのような場面においてどちらを使用したほうがいい など教えてください。

    • ベストアンサー
    • MySQL
  • CakePHPとMySqlを使用しています。INSERTしたあと、id

    CakePHPとMySqlを使用しています。INSERTしたあと、idを取得する方法について教えて頂きたいです。 データをINSERTとSELECTをする関数を作成し、 メインの関数でINSERTとSELECTをする関数を呼び出すと、idがNULLとなってしまいます。 しかし、1つの関数でINSERTとSELECTを行うとidを取得する事ができました。 この方法は問題ないのでしょうか? この方法だとなぜidが取得できるんでしょうか? また、これ以外の方法でidを取得できる方法があればお教え頂きたいです。 宜しくお願いします。 【hogeテーブル】 id(PRIMARY。オートインクリメントさせています) name ●idがNULLになる方法 function main() { $this->insertHoge(); $id = $this->getHoge(); ←結果がNULLになる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($sql); return $result; } function getHoge() { $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($sql); return $result; } ●idが取得できる方法 function main() { $id = $this->insertHoge(); ←idがかえってくる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($_sql); $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($_sql); return $result; }

    • 締切済み
    • PHP