• ベストアンサー

iserease のDB2 UDBに対してODBC接続のVBAでSQL

iserease のDB2 UDBに対してODBC接続のVBAでSQLを書いています。 下の構文のWHERE句に対しOR条件を加えると 読むレコードがゼロ件になってしまいました。 QSQL = QSQL & " WHERE TNO='" & PTNO & "'" QSQL = QSQL & " OR TNO='" & PSPC & "'" 1行目のPTNOの指定だけだと抽出できます。 なぜでしょうか。よろしくお願いします。

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

  • ベストアンサー
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

同じようにやってみましたが、私は普通にレコードが取得できます。 レコードセットを開く直前に、QSQLをmsgboxか何かに出力して 意図したsqlになっているか再確認してみてはいかがでしょうか。

hokaktei
質問者

お礼

前述の構文のすぐ前にあるLeft join が原因でした。 存在しないデータをLeft joinしようとした場合ゼロ件(?)になってしまうようでした。 MSGBOXで見てたらわかりました。ありがとうございました!

hokaktei
質問者

補足

ちゃんとなってました,,,

その他の回答 (1)

回答No.1

OR条件を加えるとゼロ件って不思議ですね。。。 原因はわかりませんが、以下の場合はどうなりますか? QSQL = QSQL & " WHERE TNO IN ('" & PTNO & "', '" & PSPC & "')"

hokaktei
質問者

お礼

ありがとうございました!

hokaktei
質問者

補足

一緒でした。TNOがPTNOの場合のみデータが取れました。

関連するQ&A

  • OS/390 DB2 簡単なSQLで結果が異なるのですが 

    簡単なSQLなのですが、 バージョン違いが起因するのか、 導入の際のテーラーリング作業の違いなのか、 SQL結果が異なって困ってます。 状況は以下の通りです。 テーブルA 定義内容 項目 a b c    ・    ・    ・ データ内容(aの値)    +-+    |a|    +-+    |1 |    +-+    |2 |    +-+    |3 |    +-+   ~~~~~   ~~~~~    | | SQL SELECT * FROM テーブルA    WHERE a = '1' OR a = '3' 実行結果 マシンA(DB2/UDB V6)    +-+    |a|    +-+    |1 |    +-+    |3 |    +-+ マシンB(DB2/UDB V7)    +-+    |a|    +-+    |1 |    +-+ 因みにUDB以前のDB2・V5でも、 DB2/UDB V6と同じ結果です。 またaについてはindex項目ではありません。 この結果を同じにするにはどうしたらいいか、 ご存知の方がいらっしゃいましたら、 アドバイスをお願いいたします。 (直感で考えるとV6以前の結果のほうが 正しいと思うのですが・・・)

  • oracleのSQLパフォーマンスについて

    oracleのSQLパフォーマンスについて質問です。 当方、SQLは初めてで、ずぶの素人ですが、SQLパフォーマンスを改善することになりました。 質問の仕方も悪いとは思いますが、お力添えをいただきたいと思います。 【質問1】 DBのレコード件数は、SQLパフォーマンスにどう影響するでしょうか?以下例のようなことが知りたいです。 例1 INDEXのないテーブルに対しSQLを発行する場合、レコード件数の多いDBとレコード件数の少ないDBでは、レコード件数が少ない方が、パフォーマンスが良い? (前提として、検索対象DBは、レコード件数以外に差がないとする) 例2 WHERE句にINDEX項目を使用した場合、DBのレコード件数はパフォーマンスに影響しない (前提として、アクセスパスは適切で、検索対象をうまく絞り込むことができる) 例3 WHERE句にINDEX項目を使用したSQLをレコード件数の多いDBに発行する場合と、WHERE句にINDEX項目がないSQLをレコード件数の少ないDBに発行する場合では、どちらがパフォーマンスがよいのか (前提として検索対象DBは、レコード件数以外に差がないとする) 【質問2】 INDEXをDBに追加すると、INSERT、UPDATE、DELETEの際に、どのくらい影響するのでしょうか? 対象のDBは、5項目あり、400万件くらいのレコードがあります。また、複合項目(2項目)のプライマリキーと、単一INDEXがついており、新たに3項目の複合INDEXを追加しようとしています。 以上、よろしくお願いいたします。

  • Access VBAからcsvの出力について

    Access VBAからcsvの出力について Select * into csvファイル From テーブル名 Where ••• Where句なし、全件ではちゃんと出力できるのですが、 Where句ありだと0件になってしまいます。 Where句指定はできないのでしょうか? よい方法があれば教えてくださいm(._.)m 環境はフロントAccess ,DBはSQL server バッチでの出力も試みましたが、 Serverがあるフォルダにアクセス権限がないため、 断念しました。

  • DAOでODBC経由のRDBに接続し、SQLでアクセスしたい。

    Dim ws As DAO.Workspace, db As DAO.Database Dim rs As DAO.Recordset ' デフォルトのワークスペースを定義する Set ws = DBEngine.Workspaces(0) ' ODBC接続文字列を指定してデータベースを開く Set db = ws.OpenDatabase("", False, False, _ "DSN=SQL_K;ODBC;Driver={SQK_K};" & _ "SERVER=(local);DATABASE=pubs;" & _ "UID=*****;PWD=*****;" ' SQLステートメントを指定してレコードセットを作成する Set rs = db.OpenRecordset("select * from TWSQLK1",dbOpenDynaset, dbSeeChanges)   このレコードセットは正常に行きますが   直接SQLを記述する方法が、わかりません   

  • ODBC接続でデータ件数を求める方法を教えてください

    いつもお世話になっております。 ODBCサーバー:IBM DB2(UDB)なのですが、下記コードを実行しても 件数が表示されず取得できませんでした。 何方か上記サーバーで件数を取得する方法をご存知でしたら、ご教授お願いいたします。(表示データ件数のコントロールをしたいのです) $con2 = odbc_connect($ODBCDSN2, $DSNUSER2, $DSNPASS2); $sql2 = "SELECT Count(*) AS cnt FROM tabl1"; $rst2 = odbc_exec($con2, $sql2); $col2 = odbc_fetch_array($rst2); $tcnt = $col2[cnt]; print "tcnt="; print $tcnt; 上記コードを、ODBC MySQLで実行すると件数が表示されますのでIBM DB2(UDB)固有の 状況だと思うのですが・・・どうしたらいいのか解りません。

    • 締切済み
    • PHP
  • VC++からSQL Server 2008への接続

    現在ODBCを使用してSQL Serverと接続しています。 ODBCだとそれを使用するマシン全てにODBCの設定をしないといけないため、ODBCの使用を避けようと思っております。 そこで、ODBC以外を使用して、マシンへの設定等も必要がない、SQL Serverと接続するものを探しております。 開発言語はVS2010のVC++です。 DBはSQL Server 2008です。 ADOとODBCであれば、providerに直接指定することで、ODBCの接続なしにSQLに接続できると耳にしたのですが、 やり方がわかりません(VBのページがやたら出てくる) いい接続方法はありますでしょうか? また、その構文例、参考ページがありましたらご教授頂けたらと思います。 よろしくお願い致します。

  • エクセルVBAでのSQLについて

    エクセルVBAで、SQLを記述しているのですがwhereの抽出条件にセルの値を指定したいと思っています。その当該セルの値を変更することで、抽出条件を変更することができるようにしたいです。 しかし、どのような記述にすればよいか分かりません。以下のような記述をしたのですが、うまくいきません。すみませんが、教えていただけないでしょうか。よろしくお願い申し上げます。 ◆抽出条件を指定するセル:A1 セルA1には、数字(例:1000、2000等)をいれます。 mySQL = " SELECT * FROM [◆◆シート!] WHERE Range("A1")"

  • ODBCによるエラー

    ODBCについての質問です VB.NET・AS400でODBC接続で開発しているのですが、以下のエラーが出てしまい困っています ************************************************************ ERROR [HY000] [IBM][iSeries Access ODBC ドライバー][DB2 UDB]SQL0666 - SQL QUERYが指定された時間制限または記憶制限を超えています。 ERROR [01000] [IBM][iSeries Access ODBC ドライバー]拡張動的 サポート が使用不能です。 ************************************************************ わかっている事は ・4つのDBを接続している場所でエラーが出ている ・昔は起きておらず、最近おき始めた(昔は接続数が少なかったが最近増えた) ・コントロールパネルのデータソース(ODBC)の「拡張動的サポートを使用可能にする」のチェックボックスは付いている ・上記エラーが出るPCと、エラーが出ずに正常に終わるPCがある です 検索しても対処法が出てこずに少々困っています 宜しくお願いします

  • DB検索について

    (1)PHPにてSQLをコールしてテーブルから情報の取得を行いたいのです。  $cmnd = "select * from table_a where id=01";を実行し(fetch使用)  仮に15件セレクトされたとすると、抽出された15件は  プログラム内のどこに格納されるのですか? (2)また、そのレコードを順じ処理する場合において、終了条件はどの様に  判定したら良いでしょうか?  DB:oracle

    • 締切済み
    • PHP
  • PowerShellからODBC接続してSQL実行

    PowerShellからORACLEにODBC接続してSQL実行しています。 抜粋となりますが、以下の処理をしていますが、データの取得で エラーが発生し、どうしてもORACLEのDBから抽出できません。 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Data") $connectionString="DSN=xxxxx;uid=xxxxx;pwd=xxxxx;" $conn = New-Object System.Data.Odbc.OdbcConnection($connectionString) $odbcCommand = New-Object System.Data.Odbc.OdbcCommand $odbcCommand.Connection = $conn $sql = "select sysdba from dual" $odbcCommand.CommandText = $sql $dataAdapter = New-Object System.Data.Odbc.OdbcDataAdapter $dataAdapter.SelectCommand = $odbcCommand $dataSet = New-Object System.Data.DataSet $nRecs = $dataAdapter.Fill($dataSet) "1" 個の引数を指定して "Fill" を呼び出し中に例外が発生しました: "算術演算の結果オーバーフローが発生しました。" 発生場所 行:1 文字:27 + $nRecs = $dataAdapter.Fill <<<< ($dataSet) + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException DataSetに格納でエラーとなったので、ExecuteReaderに変えて実行。 上記、処理に $conn.Open() を追加し、 $odbcReader = $odbcCommand.ExecuteReader() "0" 個の引数を指定して "ExecuteReader" を呼び出し中に例外が発生しました: "算術演算の結果オーバーフローが発生しました。" 発生場所 行:1 文字:41 + $odbcReader = $odbcCommand.ExecuteReader <<<< () + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException と、DataSetを使おうが、ExecuteReaderを使おうが同じエラーが発生した。 何が原因で発生しているのでしょうか。 また、対処はどのようにしたらよいのでしょうか。 お願いします。 環境 ・Windows7 64ビット ・64ビット oracle client 11gR2 ・sqlnet.ora、tnsnames.ora を作成 ・odbcデータソース作成  TNSサービス名には、tnsnames.ora にあるサービス名を指定

専門家に質問してみよう