- PR -

SQLparameterとトランザクション

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-18 14:49
引用:

じゃんぬねっとさんの書き込み(2006-02-18 02:11)より:

私の場合はそれプラス、使う直前に変数を宣言して
必ず、Try 〜 Finally パターンを使ってもっとスコープを限定します。
Command、Transaction も一応 IDispose インターフェイスを実装しているので、
どうしても、Dispose しておかないとしっくりこない。


すみません、タイプが面倒なので、省略しちゃいました。しないわけでないです。

 Command, Transaction に関して、ブログに書いているとおり、ちょっと注意が必要ではないかと思います。Transaction は Connection から派生(?)させますから、Connection をクローズすれば当然「終了」しますよね。Transaction が「終了」するということは、その内側にある Command も、「終了」していなければおかしい。終了するんだったら「破棄」もして欲しいなぁ。。。
 また、DataSet などで、DataGrid などのデータソースに参照させたものは、変数を宣言したスコープを外れても、インスタンスは生きているわけで。ASP.NET だと、ページが破棄されるときにグリッドも破棄されて、その時データソースも破棄されるよね?なんて、不安になったり。。。
 ・・・というわけで、最近は「まとめて宣言、まとめて Dispose」な書き方をしています。

〆 written by Jitta@わんくま同盟 on 2006/02/18
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-02-18 18:28
引用:

Jittaさんの書き込み (2006-02-18 14:49) より:

 Command, Transaction に関して、ブログに書いているとおり、ちょっと注意が必要ではないかと思います。


すみません、リンクお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-18 20:24
引用:

nanbuさんの書き込み (2006-02-18 18:28) より:

すみません、リンクお願いします。


これかな。

  Dispose、、、

最近どこかで、渋木さんも言っていましたね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-02-19 05:59
リンク、ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-20 20:24
引用:

nanbuさんの書き込み(2006-02-18 18:28)より:
すみません、リンクお願いします。


 すみません、文章だけじゃ読んでもちんぷんかんぷんだろうなと思って、あえて貼りませんでした。やってしまった実例付きで再エントリする予定です。

 とりあえず、事例を書いておきます。
 ブログに書いているのは、テキストを暗号化しようとして、
using (MemoriyStream stream = new MemoryStream()) {
 using (TextWriter writer = new TextWriter(stream)) {
  書き込み処理
  writer.Close();
 }
 stream.Position = 0;
 using (TextReader reader = new TextReader(stream)) {
  読み込み処理
  reader.Close();
 }
 stream.Close();
}
としました。すると、stream.Position = 0; で、「閉じたストリームを操作することは出来ません。」という、IOException が発生します。

 System.Drawing.Graphics.FromImage で取得した Graphics も、Dispose 注意です。取得もとの System.Drawing.Image が破棄されます。

〆 written by Jitta@わんくま同盟 on 2006/02/20
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-02-20 23:43
南部です。

実例、ありがとうございました。

このスレッドというか、なんとなく、
「IDisposableを実装している = Disposeを実行しなければ」
という風潮があるようで。
むしろ、
「IDisposableを実装している = GCが解放してくれる」
ってのはダメかなぁ、、、

「すぐにリソースを解放して再利用できる状態にする必要がある。」
もの以外はですが。

ちなみに、
引用:

Jittaさんの書き込み (2006-02-20 20:24) より:
 System.Drawing.Graphics.FromImage で取得した Graphics も、Dispose 注意です。取得もとの System.Drawing.Image が破棄されます。


とりあえず、2005ではOKのようです。
#2003の環境消してしまったので。

コード:
private void Test()
{
  // Create image.
  using(Image imageFile = Image.FromFile("MyImage.jpg"))
  {
    // Create graphics object for alteration.
    using(Graphics newGraphics = Graphics.FromImage(imageFile))
    {
      newGraphics.FillRectangle(Brushes.Red, 100, 50, 100, 100);
    }
    imageFile.Save("PaintedImage.jpg"); //OK
  }
}



この例だと
コード:
private void Test()
{
  // Create image.
  Image imageFile = Image.FromFile("MyImage.jpg");

  // Create graphics object for alteration.
  Graphics newGraphics = Graphics.FromImage(imageFile);
  newGraphics.FillRectangle(Brushes.Red, 100, 50, 100, 100);

  mageFile.Save("PaintedImage.jpg"); //OK
}


Image、GraphicsはIDisposableを実装しているで、
Testメソッドが終わったらGCが適切なタイミングで、
(ええ、私がDisposeを実行して処理を遅くするまでもなく)
解放してくれるはず。

#あぁ、危険な発言をした気分、、
#私は、Disposeしますよ、ちゃんちゃん。
中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2006-02-21 10:35
>「IDisposableを実装している = GCが解放してくれる」
>ってのはダメかなぁ、、、

GCのいいタイミングなので、実際にはまったく動かない可能性もありますしねー
Windowsのハンドルなんかはすぐ使い切れますよ。

>#あぁ、危険な発言をした気分、、
>#私は、Disposeしますよ、ちゃんちゃん。

(^^
_________________
中博俊 MSMVP Visual Studio C# Since 2004/04-2005/03, MCP
http://naka.wankuma.com/
http://blogs.wankuma.com/naka/
naka@wankuma.com
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-02-21 11:42
GDIオブジェクトは

引用:

「すぐにリソースを解放して再利用できる状態にする必要がある。」



これに準ずるかな。
いっていることはある程度同意はしますよ。そのためのCriticalFinalizerObjectだし、GC.AddMemoryPressureですから。
しかしながら、例えばスレッド依存性だのこの話は細かく話すときりがない上、それらの話を十分に考慮できるだけの知識を持ち、それを実行することに対して根拠、実証を持つ必要もあると思います。
そこまでする必要があるなら、Disposeをとりあえず呼ぶほうを選ぶってだけです、私は。using便利だねぇ。

# 雑談のように気軽に適当に


[ メッセージ編集済み 編集者: ya 編集日時 2006-02-21 11:47 ]

スキルアップ/キャリアアップ(JOB@IT)