OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ExecuteとRunSQLの違いって・・・?

  • 困ってます
  • 質問No.228843
  • 閲覧数2523
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 64% (9/14)

AccessのモジュールでSQLを流す処理ですが、

Insert Into テーブル名(フィールド名…)
Select フィールド名… From テーブル名
Where フィールド名 = N(Double型変数)

このようなSQLを実行する場合に

CurrentDB.Execute SQL文 

で実行するとオーバーフローのエラーがつきます。
同じ文を

DoCmd.RunSQL SQL文 

で実行すると正常に動作します。
変数Nの値がLONGの範囲内だとExecuteを使っても正常に動作するようです。
Insert先、元のデータ型はあってますので変数Nの内容に関係していると思うのですが…
Nの値がLongの範囲内であれば、Executeでも正常に動作するようです。

Executeで扱える数値の制限みたいなものはあるのでしょうか?
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル10

ベストアンサー率 61% (75/121)

確認のため実験してみました。
環境:
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で見当違いなことを言って申し訳ありません。

>オーバーフローのエラー
については、モジュール中の変数で出ているのでは無いでしょうか?
お礼コメント
SRO

お礼率 64% (9/14)

わざわざテストまでしていただきありがとうございます。
こちらの環境はOracle8.1.6(WGS)+Access97ですが
Oracle8i(8.1.7)+Access97でも同様の現象を確認しています。
変数のせいではないかとの事ですので変数を使わず、
値をセットしてみましたが結果は同じでした。
Whereで条件を指定しているのですがWhere条件を外したところ
RunSQL、Executeとも正常に動作しましたので条件指定が原因かと思われます。
where フィールド名 = 変数
where フィールド名 = 値
where フィールド名 In(変数)
where フィールド名 In(値)
のどの場合でもExecuteではエラーとなってしまうので
とりあえずRunSQLを使うことにします。
ありがとうございました
投稿日時 - 2002-03-04 15:55:18
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル10

ベストアンサー率 61% (75/121)

通常RunSQLを実行する場合、DoCmd.SetWarnings Falseをかけてから実行しますよね? 実際に試したわけでは無いのですが、エラーになった値は、警告無く続行されてしまうと思います。 結果は、エラーになった値をNull値とするか、レコードが無いかのどちらかだと思います。 今回のケースの場合、挿入される側のテーブルが、長正数型のフィールドに それ以上の値を入れているのが原因だと思 ...続きを読む
通常RunSQLを実行する場合、DoCmd.SetWarnings Falseをかけてから実行しますよね?
実際に試したわけでは無いのですが、エラーになった値は、警告無く続行されてしまうと思います。
結果は、エラーになった値をNull値とするか、レコードが無いかのどちらかだと思います。

今回のケースの場合、挿入される側のテーブルが、長正数型のフィールドに
それ以上の値を入れているのが原因だと思われます。
エラーの根本を対策するには、挿入される側のテーブルレイアウトを直すのが良いと思います。

この内容が原因だとすると、RunSQL,EXECUTEどちらのふるまいが正常かの判断は難しいですが、
私は、Executeの動きをしてもらった方が、集計のトラブルを未然に防げるという意味でいいと思います。
補足コメント
SRO

お礼率 64% (9/14)

ご回答ありがとうございます。
ご指摘頂いた挿入される側のフィールドのデータ型ですが
倍精度浮動小数点型にしています。
また、挿入する側のフィールドはOracleのテーブルをリンクしたもので
Number(12)ですのでデータ型は大丈夫と思うのですが…
他に考えられることがありましたらよろしくお願いします
投稿日時 - 2002-03-04 13:28:22

このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ