SQLサーバにSQL(SET)文を送信するには?

解決


ゆうこ  2005-12-14 00:36:40  No: 19229

TSQLQueryコンポーネントにて、Microsoft SQL Server のDBにアクセスしています。
SELECT文、UPDATE文、DELETE文等のSQL文は正常に実行されます。
しかしSQL Serverの排他タイムアウト値(LOCK_TIMEOUT)の設定が出来ません。
'SET LOCK_TIMEOUT 0'です。
SQLサーバのDBに直接コマンド入力すると設定できます。(OSQLやクエリアナライザにて)
Delphi上では上記文字列を送信しても、例外が発生するわけでもなく
一見正常に動作しているように振舞います。
が、DBには反映されていないようです。
何か、心当たりのある方いらっしゃいましたらご教授下さい。
宜しくお願いします。
==========================================
with qryMsde do
begin
  SQL.Clear;
  SQL.Add('SET LOCK_TIMEOUT 0'); //排他タイムアウト
  ShowMessage(CommandText);      //SQL確認。大丈夫!
  try
    try
      ExecSQL;
    Except
      ShowMessage('エラー!');    //←入りません
      Exit;
    end;
  finally
    Close;
  end;

  SQL.Clear;
  SQL.Add('SELECT @@LOCK_TIMEOUT AS TIM');   //排他タイムアウト値を見る
  Open;
  ShowMessage(FieldByName('TIM').AsString);  //←初期値-1のまま!
  Close;
  end;
==========================================


Syake  2005-12-14 03:46:00  No: 19230

TSQLQueryは使ったことないのでわかりません。

TADOConnectionでどうでしょうか?
ADOConnection1.Execute('SET LOCK_TIMEOUT 1800);
当方はこれで上手くいってます。


Syake  2005-12-14 04:11:37  No: 19231

すいません。
これって、BDEですね。
失礼しました。


Syake  2005-12-14 04:50:22  No: 19232

幾度もすいません。

上記記述通りで確かにそうなりました。

私の解釈が間違い出なければ・・・(BDEは良くわからん)
'SET LOCK_TIMEOUT'は接続から接続解除まで有効
となれば、
ExecSQLは一旦接続し実行し接続解除
その後、qryMSDNで見ても初期値のまま。
って、事はないですかね?
違ってたらすいません。


ゆうこ  2005-12-14 07:13:30  No: 19233

Syakeさん  ありがとうございます。

Syakeさんの仰るとおりExecSQLで接続〜実行〜接続解除となっているようです。
一つのqryMsde.SQLで排他タイムアウト値の設定と、テーブルの更新を同時に行ったところ
テーブルの更新処理は都度設定した排他タイムアウト値で動作していました。
解決策としては、排他タイムアウト値をその都度設定すればよいかと思いましたが、
排他タイムアウト値の設定をするとParamByNameメソッドが使用できなくなってしまいました。
qryMsde.SQLにParamByNameによる値設定があると、ExecSQLメソッドで
「データベースサーバーエラー:SQL State:42000,SQL Error Code:0」
の例外が発生してしまいます。(Error Code:0ってHelpに載ってないんですよね)

TSQLQueryでSETコマンドは動作保証外なんでしょうか?


えーと  2005-12-14 18:46:21  No: 19234

Borland製のdbExpressドライバの作りは大雑把です。
きちんと使うならhttp://crlab.com/dbx/ の有料ドライバがお勧めです。

体験版ドライバでSETコマンドを試してみましたが上手く動きました。
やはりドライバの問題だと思います。


えーと  2005-12-14 18:47:26  No: 19235

URLを間違えました。
http://www.crlab.com/dbx です。


えーと  2005-12-14 18:49:55  No: 19236

お恥ずかしい。
もう一度貼らせてください。
http://www.crlab.com/dbx/


ゆうこ  2005-12-14 20:33:57  No: 19237

えーとさん

ありがとうございます。
原因がドライバにありそうとのことで、納得しました。

わたしも紹介頂いたURLからドライバをDLして試していますが
「..Demo\Win32\Query」にあるサンプルすら動作しない状態です。
エラー10061(権限がない?)例外が発生します。
確実に権限はあるものを指定しています。
又、サンプルはTSQLQueryコンポーネントを使用していないようなので
TSQLQueryコンポーネントを使ってSQLを実行しても
同様のエラーが発生してしまいます。特別な設定か何か必要だったりしますか?

※uses句にあるDBLocalは参照不可だったので、削除しました。
  削除してもコンパイルは通りました。

環境:Delphi2005 WindowsXP


えーと  2005-12-14 21:46:37  No: 19238

> 「..Demo\Win32\Query」にあるサンプル
私はDelphi2005 Professionalなのでサンプルは見つからないのですが
それはdbExpressのSQL Server用のサンプルなのでしょうか?
お使いのSQL Serverは2000という事ですよね?

> 確実に権限はあるものを指定しています。
ADOでは接続できますか?

> 参照不可だったので
ライブラリのパスの問題ではありませんか?
自分で簡単なサンプルを作って1つ1つ検証した方が早いと思います。


ゆうこ  2005-12-15 05:01:17  No: 19239

えーとさん

回答ありがとうございます。
>それはdbExpressのSQL Server用のサンプルなのでしょうか?
いえ、紹介していただいたドライバに付属してあったサンプルです。

>お使いのSQL Serverは2000という事ですよね?
はい。

>ADOでは接続できますか?
はい。
ADO接続でSET LOCKTIMEOUTが正常に動作していることが確認できました。
そのため、今回はTSQLQuery→TADOConnectionへの変更で対応したいと思います。

>ライブラリのパスの問題ではありませんか?
>自分で簡単なサンプルを作って1つ1つ検証した方が早いと思います。
結局有料ドライバでの動作確認はできませんでした。
今回は時間もなく、質問の主旨と離れてしまうということで
これで解決とさせていただきます。すみません。
えーとさんが有料ドライバで動作確認出来たということで
解決策としてあげておきます。ありがとうございました。

結論:TSQLQueryでSET命令による値設定は標準ドライバ(dbExpress)では不可能
      正常に動作するドライバなら可能。
      ADOConnectionならSET命令はOK。

Syakeさん、えーとさんありがとうございました。


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

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






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