2006/09/05

Connection.CommandTimeoutとCommand.CommandTimeout

TADOQueryを使ってINSERTやUPDATEを実行すると、約30秒で「時間切れになりました。」となってしまう現象が出ていた。ネット等で調べると、CommandTimeoutを設定すれば良さそうだとわかり試してみるが、Connection.CommandTimeoutを300秒とかゼロとかに設定しても全然変わらなかった。

以下の記事を見け、ようやく理解&解決した。
[IIS] ADOのConnection.CommandTimeoutとCommand.CommandTimeout

つまり、Connection.Commands[i].CommandTimeoutを設定するか、素直にTADOCommandを使えばよいようだ。みなさんも気をつけてね。

| | コメント (2) | トラックバック (0)

2006/01/04

SQLServerで困ったぞシリーズ2

↓これもコンパイルが通る。あとはこれと同じ。
SET @HOGE =  DBO.存在しない関数名(@FUGA)

環境: Delphi5ent + ADOExpress + SQLServer2000

| | コメント (0) | トラックバック (0)

2006/01/03

SQLServerで困ったぞシリーズ

↓これ、SQLServer2000のクエリアナライザで、このまんまコンパイル通るんですけど。設定でなんとかなるのか?

CREATE PROCEDURE spTEST01 AS
BEGIN
    INSERT 存在しないテーブル SELECT * FROM これも存在しないテーブル
END

こんなストアドをdelphiから実行すると、とても困ったことが起きるんですよ。

TADOStoredProc経由で実行してもエラーにならなず、普通にコミットできちゃう。しかも、問題のあるSQL文の直前まではコミットされているが、それ以降のSQL文は実は全く実行されていない。つまり、問題のあるSQL文の前後で整合性がとれていない状況ができあがる。フォー。

コミット後にADOStoredProc1.Parametersなどを参照すると「アクティブなトランザクションがありません。」となることがあるが、こんなエラーメッセージを出されても何がなんだか分からん。まさか、作成済のストアドに実はコンパイルエラーがあるなんて考えもしないから、問題解決まで一体どれほど苦労したことか。

今回、誰が悪いのかといえば、ストアドをデバッグした人かと思ったら、テーブルを削除した人がいて...。それにも係わらずストアドがコンパイルエラーにならないのもどうかと。そして、そんなストアドを実行してもエラーにならないのもどうかと。

環境: Delphi5ent + ADOExpress + SQLServer2000

| | コメント (0) | トラックバック (0)

2005/03/30

SQLServer

SQLServerでの仕事に手を出してしまった。(選べるほどのアレが無いの)
Delphi5+ADOは経験あったので良かったが、問題なのはTransact-SQLが忘却の彼方な事。このところPL/SQLオンリーだったので、頭の中ではPL/SQLで考えてからTransact-SQLに翻訳しようとしてしまう。すると、これってどう翻訳するの?というのが沢山あって。

戸惑ったのは、Packageがない事。Package内でしか使用しないローカルなProcedueやFunctionもグローバルに登録することになるんだろうか。それはちょっとなあ。

あと、%ROWTYPEの代わりがないのも面倒だ。あるところで聞いてみたところ「レコードをフェッチするようなプログラムはあまり書かないからか気にならない。なるべく文単位で処理するようにしてるので。」との事。そうかあ。そうなのか。そっちの流儀に慣れるのには時間が掛かりそうだ。

| | コメント (0) | トラックバック (0)