SQL文が不安定?


貧血  2007-05-11 01:43:16  No: 136365

SQL文が不安定?

いつも参考にさせて頂いております。
下記SQL文であるテーブルを検索した時に、レコードが表示されたり、されなかったり不安定です。
このような事が考えられる原因があるのでしょうか?
宜しくお願いします。
    
【開発環境】
・VB6 SP6 SQLServer7.0(SPはなし)

St_UriDate="20070101"
Ed_UriDate="20070131"

SQL = "SELECT *" _
    & " From UriDB" _
    & " Where (UriDB.UriNo >= '000001')" _
    & " And (UriDB.UriDate >='" + St_UriDate + "' And UriDB.UriDate <='" + Ed_UriDate + "')" _
    & " ORDER BY UriDB.UriNo;"


ささき  2007-05-11 02:06:39  No: 136366

検索した時に、レコードが表示されたり、されなかったり
それぞれ実際発行されているSQLを調査すればわかるかと思いますが。

> & " And (UriDB.UriDate >='" + St_UriDate + "' And UriDB.UriDate <='" + Ed_UriDate + "')" _

の + が非常に私は気味が悪いです。 & でなくて良いのでしょうか?


貧血  2007-05-11 02:23:15  No: 136367

ささき様お返事有難うございます。

EnterPriseManagerを使用して表示させると
しっかり表示されます。
VB上のコードに誤りがあるとしか思えませんので、
これからは、「&」にしてみます。
これで、しばらく様子を見て報告させて頂きます。

有難うございました。


魔界の仮面弁士  2007-05-11 02:26:27  No: 136368

文字列連結に、「& 演算子」と「+ 演算子」が同時に使われていて、
統一性がありませんが、それは置いといて。

SQL 自体におかしな点は見当たらないので、まずは、その前後の処理に
問題が無いかを見直す必要があるでしょう。
また、VB 側の SQL 生成に問題が無いのであれば、通信上の不具合や
データの異常なども考慮しなければいけないので、サーバ側で
SQL のトレースログを取ってみるべきかも知れません。

> このような事が考えられる原因があるのでしょうか?
データの更新が別アプリ(あるいは、別のConnection)で行われていて、
そちらがコミットされる前にデータを参照していたため、古い情報が
読み込まれているとか。

LAN に同じ IPアドレスのサーバがいつの間にか追加されていたため、
ネットワークが不安定になり、切断されたり別サーバに接続されるなどの
障害が出ていたが、それが On Error で握りつぶされていたりとか。

> レコードが表示されたり、されなかったり不安定です。
「レコードが返されるかどうか」ではなく、レコードは返されるが、
表示されない場合がある、ということでしょうか?
また、同じ SQL を何度も連続で(時間を空けずに)実行した場合も、
毎回、結果が異なるのでしょうか?


ささき  2007-05-11 03:01:02  No: 136369

> 文字列連結に、「& 演算子」と「+ 演算子」が同時に使われていて、
> 統一性がありませんが、それは置いといて。

すいません、私はこれで非常に苦い経験をしたもので・・・。


もげ  2007-05-11 03:30:11  No: 136370

>SQLServer7.0(SPはなし)

'何故今時7.0かと...というのは置いておいて、

かなりいろいろ不具合がありますので、
SPをあててみてください。


貧血  2007-05-18 04:15:38  No: 136371

皆様お返事有難うございます。

すべて「&」に切り替えましたが、やはり現象は出てしまいます。
表示されたり、表示されなかったりと不安定です。

>「レコードが返されるかどうか」ではなく、レコードは返されるが、
>表示されない場合がある、ということでしょうか?
>また、同じ SQL を何度も連続で(時間を空けずに)実行した場合も、
>毎回、結果が異なるのでしょうか?

上記のSQL文でアクセスした時に、グリッドに表示される行数が変わってしまう。
(例)10回連続で検索をしても4明細しか表示されなかったのに、いつのまにか5明細に変わっていた。
4明細しか表示されない時に、エンタープライズマネージャーで同じ条件で開くと5明細表示されていました。

説明が下手で申し訳ございません。。。

魔界の仮面弁士様やもげ様が仰られてる点を確認してみます。
①インターネットVPNを利用してのデータベースアクセスのためなのか。
②サービスパックが古いためか。

①と②を確認後報告させて頂きます。


貧血  2007-05-29 04:45:07  No: 136372

大変申し訳ございません。
原因がわかりました。。。

Aのパソコンにてデータを保存中に、Bのパソコンでデータを呼び出すと
この現象が出る事が分かりました。

SQLServerの場合保存する時に、以下の三行を記述しないと保存が出来ませんが、この三行がロックをしているのでしょうか?

    MyTable.CursorLocation = adUseClient
    MyTable.CursorType = adOpenKeyset
    MyTable.LockType = adLockPessimistic

また、上記回避方法はどのようにすればよいのでしょうか?
宜しくお願い致します。


魔界の仮面弁士  2007-05-29 06:50:00  No: 136373

> Aのパソコンにてデータを保存中に、Bのパソコンでデータを呼び出すと
> この現象が出る事が分かりました。
それって、トランザクション管理の問題だったりはしませんか?

> この三行がロックをしているのでしょうか?
環境が無いので試せませんが、手元の資料(ISBN:4798101303)によると、SQL Server 7.0 の場合は
「adOpenKeyset + adLockPessimistic」または「adUseClient」で開くと、レコードセットを
開いた時点で排他ロック(XL)が取得されるのだそうです。

ちなみに、これが Jet であれば、
  adLockPessimistic: 編集開始時に XL 取得、Update メソッドで XL 解放
  adLockOptimistic : Update メソッドで XL 取得および解放
と働きます。このあたりは ADO の設定だけでなく、OLE DB などの違いも
大きく関わってくる部分ですので、事前によく確認しておく必要がありそうですね。

>    MyTable.CursorLocation = adUseClient
>    MyTable.CursorType = adOpenKeyset
>    MyTable.LockType = adLockPessimistic
そもそも、そのような組み合わせは論外かと思いますよ。ヘルプ(MDAC SDK)にあるように、
adUseClient モードのときは、adOpenStatic 以外のカーソルは使えないのです。

adUseClient モードを使いたければ、adOpenStatic を選択すべきですし、
adOpenKeyset で取得したいなら、adUseServer モードを選択する必要があります。
それぞれのプロパティの違いについて、再度確認してみてください。

> また、上記回避方法はどのようにすればよいのでしょうか?
まずは、CursorLocation / CursorType / LockType の組み合わせ 32 種をすべて試し、
Recordset.Open 後に、それらのプロパティの値を再確認するような実験を行ってみてください。
サポートされていない組み合わせで Open されると、CursorType および LockType プロパティが
別の値に自動補正されますので、どの組み合わせが「サポートされているカーソルモードなのか」を
検証できるでしょう。


貧血  2007-05-29 07:40:30  No: 136374

魔界の仮面弁士様お返事有難うございます。

意味もわからず使っておりました。
もう一度一から調べなおし、確認したいと思います。
どうも有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加