- ベストアンサー
ExecuteとRunSQLの違いって?
- AccessのExecuteとRunSQLメソッドの違いについて説明します。
- Executeメソッドを使用してSQL文を実行するとオーバーフローエラーが発生する場合があります。
- 一方、RunSQLメソッドを使用すると正常に動作することが確認されています。変数Nの値によって動作が異なるようです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
確認のため実験してみました。 環境: Oracle8.1.6(WGS)、Access2000、Access2000のリンクテーブルとしてテーブルをODBCを使ってアタッチ。 SQL> create table h_test (test1 number(12)); 表が作成されました。 SQL> insert into h_test (test1) values(123456789012); 1行が作成されました。 SQL> insert into h_test (test1) values (123456789); 1行が作成されました。 ACCESS側の処理Execute,RunSQLともに結果は同じ: Sub test_2() Dim DB As DAO.Database Dim StSQL As String Set DB = CurrentDb DoCmd.SetWarnings False StSQL = "insert into TEST2 (test1) select test1 from H_TEST" DoCmd.RunSQL StSQL DoCmd.SetWarnings True DB.Execute StSQL End Sub ACCESS側test1フィールドを以下の型にした場合 Long→123456789012のデータが正しく挿入されない(Null) Double→どちらも正しく挿入 ご質問のエラーは出ませんでした。 #1で見当違いなことを言って申し訳ありません。 >オーバーフローのエラー については、モジュール中の変数で出ているのでは無いでしょうか?
その他の回答 (1)
- sgh
- ベストアンサー率61% (75/121)
通常RunSQLを実行する場合、DoCmd.SetWarnings Falseをかけてから実行しますよね? 実際に試したわけでは無いのですが、エラーになった値は、警告無く続行されてしまうと思います。 結果は、エラーになった値をNull値とするか、レコードが無いかのどちらかだと思います。 今回のケースの場合、挿入される側のテーブルが、長正数型のフィールドに それ以上の値を入れているのが原因だと思われます。 エラーの根本を対策するには、挿入される側のテーブルレイアウトを直すのが良いと思います。 この内容が原因だとすると、RunSQL,EXECUTEどちらのふるまいが正常かの判断は難しいですが、 私は、Executeの動きをしてもらった方が、集計のトラブルを未然に防げるという意味でいいと思います。
補足
ご回答ありがとうございます。 ご指摘頂いた挿入される側のフィールドのデータ型ですが 倍精度浮動小数点型にしています。 また、挿入する側のフィールドはOracleのテーブルをリンクしたもので Number(12)ですのでデータ型は大丈夫と思うのですが… 他に考えられることがありましたらよろしくお願いします
お礼
わざわざテストまでしていただきありがとうございます。 こちらの環境はOracle8.1.6(WGS)+Access97ですが Oracle8i(8.1.7)+Access97でも同様の現象を確認しています。 変数のせいではないかとの事ですので変数を使わず、 値をセットしてみましたが結果は同じでした。 Whereで条件を指定しているのですがWhere条件を外したところ RunSQL、Executeとも正常に動作しましたので条件指定が原因かと思われます。 where フィールド名 = 変数 where フィールド名 = 値 where フィールド名 In(変数) where フィールド名 In(値) のどの場合でもExecuteではエラーとなってしまうので とりあえずRunSQLを使うことにします。 ありがとうございました