.NETSQLServer日記

SQLServer2000 ストアドでOutputを取得する

1 Mins read

これも覚書、前にもくらった記憶が(苦笑)

ストアドからOutputされた値をCommandItemで受け取ったら、Connect Close後にしか
中身が見えないことに注意!
 

' Assumes that connection is a valid SqlConnection object.
Dim command As SqlCommand = New SqlCommand("SampleProc", connection)
command.CommandType = CommandType.StoredProcedure

Dim parameter As SqlParameter = command.Parameters.Add( _
  "RETURN_VALUE", SqlDbType.Int)
parameter.Direction = ParameterDirection.ReturnValue

parameter = command.Parameters.Add( _
  "@InputParm", SqlDbType.NVarChar, 12)
parameter.Value = "Sample Value"

parameter = command.Parameters.Add( _
  "@OutputParm", SqlDbType.NVarChar, 28)
parameter.Direction = ParameterDirection.Output

connection.Open()

Dim reader As SqlDataReader = command.ExecuteReader()

Console.WriteLine( _
  "{0}, {1}", reader.GetName(0), reader.GetName(1))

Do While reader.Read()
  Console.WriteLine( _
    "{0}, {1}", reader.GetInt32(0), reader.GetString(1))
Loop

reader.Close()
connection.Close()

Console.WriteLine( _
  " @OutputParm: {0}", command.Parameters("@OutputParm").Value)
Console.WriteLine( _
  "RETURN_VALUE: {0}", command.Parameters("RETURN_VALUE").Value)
Read more
.NETASP.NETVB日記

VB.NETのFormat関数とVB6のFormat関数の差

1 Mins read

毎日寒いね~・・・一気に冬将軍到来か!って感じですが皆さんいかがお過ごしでしょうか?

題名のとおりDotNetになってFormat関数があることにはあるのだが、挙動が違うので、少々覚書

VB6のまま使用するのであればMicrosoft.Visualbasic.Format関数というものが存在するのでこちらを使用する。

ただし「Microsoft.Visualbasic」を使用する時点で「.NET Framework」構想からは外れた設計になることを覚悟の上ですが・・・

まぁそうは言ってもAPIの使用やComをCreateObjectするのではないので「.NET Framework」が入っている環境であれば動くから良いかな:roll:

違いといえば、いろいろ違いますが中でも良く使う日付系の指定文字だけど「yyyy/MM/dd HH:mm:ss」とmmの大文字小文字をちゃんと指定してあげないと月なのか分なのかみたいな狙ったとおりに動かなかったりといろいろあるんだよね。

細かいところは調べてみてね!

Read more
.NETASP.NETパソコンのこと日記

DataSetってどうなの?

1 Mins read

なんかこのブログを見てくれている方が回りにいらっしゃるようでうれしい:roll:

突然ですが、言い訳言わせて!

・現在、IE7やFireFoxではCSS設定のサボりで描画が乱れます(苦笑)
・ページ最後のLatestPostとLatestCommentも同一の物が表示されているのもプラグイン導入のサボりです(汗)

そのうち直しますのでお許しを:cry:

さてさて本題♪

DataSetについてだけど、DotNetからクライアント側のViewとしてDatasetが使われるようになっていますが、
内部にはまさにDatabase丸ごと入るような設計になっているため、使いづらい場面が多々あったんだよね。
ようするにTableを複数保持したりDatasetからじゃないとシリアル化出来なかったりと「アクセスの入り口はDataset!」
と強制されていた。

しかし、ADO.NET2.0になってから(VS2005・・・VS2003もかな)はDataTableにも使いやすいメソッドが多数のって
DataReaderなどのと連携も簡単に取れるようになった、えらい!

DB情報の使いかただってTable単位のアクセスが多いし、複数のテーブルを一気に使用する頻度って少ないと思うんだよね。

そうするとDataTableだけを使用してI/Oした方がプログラマも分かりやすいしイメージしやすい!

つーことでDataTableに一票!:razz:(初めからこうしてよMSさん・・・・)

Read more
.NETASP.NET日記

WebシステムではDataAdapterを使うな!

1 Mins read

過激な題名から入りましたが、VB.NETのお話です。

さてVB6などから.NETになってDatabaseへのアクセスするのに以下のようなクラスを使うようになりました。

・DataReader
・DataAdapter

終わり・・・

かなりハショッてます(汗)

要するにConnectionとCommand系クラスはあまり変わらないのですが、
Recordsetだけは大きく2つのクラスに分解されています。

Selectデータの取得方法が前者に上げたDataReaderとDataAdapterになったのですが、
それぞれ使用する場面が分かれます。

1.DataReaderは前方向カーソルのデータ取得になっていて取得はグルグルLoop処理が必要になります。

「メリット」
View情報がDBサーバー上にあり、クライアントサイドにはReadしない限り保持されないので動作が軽い。

「デメリット」
データは上位順にしか取得出来ないのでApp側でコントロール表示などは行ってあげる必要がある。
Paging処理など動的にPageクラスにセットしてあげる必要があるので簡単に出来ない。

2.DataAdapterはDataSetクラスにヒットしたデータを一発でいれる

「メリット」
DataSetを使用して動作するコントロールが多数あるので開発が楽。
必要なデータを簡単にDataSetを通じてClose後でも使用できる。
Paging処理もクラス任せで楽。
また、直感的に修正して更新も出来るなど使い勝手が良い部分も

「デメリット」
ヒットしたDataを全部DataSetに入れるのでクライアント側のメモリ領域を使用してしまい処理が遅い。
(要するにグルグルLoopをALLしてるってこと)

以上になります。

一見すると「DataAdapterの方がいいところいっぱいじゃん!?」と思いでしょう???

ここが落とし穴なんだがや!
楽だと思ってDataAdapterでFillばっかり使っているとやられてしまうで(誰だお前は(苦笑))

もちろん使うタイミングの問題なのですが、Webでもクラサバでも主要なデータを任意のキーで
検索する機能があるシステムが多くなってきました。

この時にDataAdapterを使用して大量データの表示、Paging処理など行うとヒットしたデータを
DataSetに入れてしまう関係でとんでもなく遅い処理になってしまいます!

DataGridなどで大量データを扱う場合に表示が遅いのはこのためドス:oops:

★具体例だと、100万件のデータを任意で検索し10件ごとPagingし3Page目を表示する時、
仮に100万件がヒットしたとして、ヒットデータをDataSet(メモリ)に入れる、
そこから30件目見つけて10件分を表示することになっているので、なんで?って思えるぐらい遅いです。

DataReader使ってLoopで30件目から10件分、取ってきたほうがよっぽど早い!
管理人のテストでは最後の10件を表示する時もこちらのほうが数倍早かった:roll:

余談だけど、Paging処理はDBによりSQLに任せる方法もあります。
例えばMySQLやPostgresなどはLimit関数、SQLServerやOracleはRowIDを使用するなど
しかし、DBによってはPaging処理が整っていなかったりするのでApp側の違いを覚えておくのも
損はないでしょう♪

作成段階では少量のデータで問題なく動いても、普通はテスト段階、あるいは本番稼動後、
じわじわとボディーブローのように遅くなってきます。

昨今はWebはもちろん企業内のシステムも膨大な検索が出来るシステムになってきました。
作ってからの手直しはデグレが怖くて直せなくなりますので作る前からの情報をお勧めします。

最後に適材適所が必要で、DataSetも使う場面によっては楽チンである:???:

管理人も2003の時にテスト段階でこの問題に気づきPaging処理などを直したことがあるので復習兼ねて覚書:razz:

おまけ「DataSetの新機能」非同期って言葉がミソ♪

Read more
.NETASP.NETパソコンのこと日記

Disposeにてアンマネージドコードとマネージドコードの違い

1 Mins read

前回の続きドス:evil:

前回「Dispose」の実装について記述しましたが

  'クラスのリソースを解放するオーバーロードされた Dispose メソッド。
  'このメソッドは基本クラスの Dispose メソッドおよび Finalize メソッドから呼び出す必要があります。
  Protected Overridable Sub Dispose(ByVal disposing As Boolean)
    If Not Me.disposed Then
      If disposing Then
        ' Insert code to free unmanaged resources.
      End If
    ' Insert code to free shared resources.
    End If
    Me.disposed = True
  End Sub

引数にBuooleanの引数があり、内部If文でTrueとFalseで開放の種類を選別できる形になっていますが、
これの意味を解説しますね。

.NETではCLRという中間言語を使用して管理しています。

しかしWin32APIなど旧来のロジックも記述することが出来るので、開放時のタイミングがNew元が開放するのと
GC任せで開放するのではタイミングにずれが生じ、後者の場合CLR以外の記述がある時に問題が発生する可能性があります。

New元が呼び出す「Public Overloads Sub Dispose() Implements IDisposable.Dispose」内では

全ての開放が出来る「Dispose(True)」で呼び出され

いつ呼び出されるか分からない「Protected Overrides Sub Finalize()」内では

CLRが管理するものだけ開放が出来る「Dispose(False)」で呼び出されているのです。

なので特殊対応しているものでない限りIf外に記述することになるでしょうね:razz:

特殊対応は責任を持ってその都度、後処理が必要になるということですな:cool:

Read more