2007年5月31日木曜日

Panasonic Let'sNote CF-Y7 ハイスペックモデル購入

Panasonic Let'sNote CF-Y7 ハイスペックモデル買いました。


今届いたのですが

軽い!! めちゃ軽い!!

今のノートは重くてとてもじゃないけど持ち運べない。
客先に持って行く時は何度も捨てて帰ろうかと思ってたので

うれしいぃ~!!!!

2007年5月28日月曜日

.NET DateTimePicker Focus時に反転表示されない。

FormにDateTimePicker1つとボタンを1つ配置します。
ボタンのClickイベントにMe.DateTimePicker1.Focusを書きます。
Formを起動しDateTimePicker1のドロップダウンカレンダーから任意の日付を選択した後、ボタンをクリックしDateTimePickerにFocusすると反転表示ません。
これではDateTimePickerにFocusが当たっているのか見た目ではわかりません。

回避方法はいろいろあります。

1.DateTimePickerのShowCheckBoxプロパティを切り替える
2.DateTimePickerのShowNumericUpDownプロパティを切り替える
3.SendKeys.Send("{RIGHT}")

1と2はコントロールがちらつきます。
3が一番よさそうですが、VistaではSendKeys.Sendがエラーになると聞きます。

他に何かよい方法はないのでしょうか?

.NET 静的コンストラクタ

静的コンストラクタの存在を完全に忘れていました。

Public Class Sample
'自分自身のインスタンスです。
Private _Instance As Sample

 

'静的コンストラクタです。
Shared Sub New
_Instance = New Sample  
End Sub 
End Class

.NET SubMainからスプラッシュウインドウを表示する。

過去記事ログイン画面を表示するを、アプリケーション起動時に、スプラッシュ画面を表示してログイン画面を表示し、メインメニュー画面を表示するように変更します。


Public Class Main


 

    'アプリケーション スレッドに関するコンテキスト情報です。

    Private Shared _MainApplicationContext As ApplicationContext


 

    'アプリケーションエントリーポイント

    Public Shared Sub Main()

        'アプリケーションコンテキストオブジェクトを作成します。

        _MainApplicationContext = New ApplicationContext


 

        'XPスタイルに設定します。

        Application.EnableVisualStyles()


 

        'スプラッシュウィンドウを表示します。

        Dim frmSplash As New SplashForm

        AddHandler frmSplash.FormClosed, AddressOf frmSplash_FormClosed

        _MainApplicationContext.MainForm = frmSplash

        Application.Run(_MainApplicationContext)


 

    End Sub


 

    'スプラッシュウインドウを閉じた時の処理です。

    Private Shared Sub frmSplash_FormClosed(ByVal sender As ObjectByVal e As FormClosedEventArgs)

        'ログイン画面を表示します。

        Dim frmLogin As New Login

        AddHandler frmLogin.FormClosed, AddressOf frmLogin_FormClosed

        _MainApplicationContext.MainForm = frmLogin

        frmLogin.Show()

    End Sub


 

    'ログイン画面を閉じた時の処理です。

    Private Shared Sub frmLogin_FormClosed(ByVal sender As ObjectByVal e As FormClosedEventArgs)

        'メインメニューを表示します。

        If CType(sender, Form).DialogResult = DialogResult.OK Then

            Dim frmMainMenu As New MainMenu

            p_MainApplicationContext.MainForm = frmMainMenu

            frmMainMenu.Show()

        End If

    End Sub


 

End Class


スプラッシュウインドウは3秒間表示するよう設定しました。

Public Class SplashForm


 

    ''' <summary>

    ''' コンストラクタ

    ''' </summary>

    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。

        InitializeComponent()


 

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        Call Init()

    End Sub


 

    ''' <summary>

    ''' Loadイベントです。

    ''' </summary>

    Private Sub SplashForm_Load(ByVal sender As ObjectByVal e As System.EventArgs) _

    Handles Me.Load

        'タイマーを開始します。

        Dim timer As New Timer

        AddHandler timer.Tick, AddressOf Timer_Tick

        timer.Interval = 3000

        timer.Start()

    End Sub


 

    ''' <summary>

    ''' タイマー終了時のイベントです。

    ''' </summary>

    Private Sub Timer_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs)

        '画面を閉じます。

        Me.Close()

    End Sub


 

    ''' <summary>

    ''' 初期化処理です

    ''' </summary>

    Private Sub Init()

        '画面中央に表示します。

        Me.StartPosition = FormStartPosition.CenterScreen

        'タイトルバーなどを表示しません。

        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None

        'タスクバーに表示しません。

        Me.ShowInTaskbar = False

    End Sub


 

End Class

.NET SubMainからログイン画面を表示する。

Application.Runメソッドのパラメータに指定されたフォームが閉じられると、アプリケーションは終了します。同様に、Application.RunメソッドのパラメータにApplicationContextを指定すると、そのMainFormプロパティに指定されたフォームが閉じられた時に、アプリケーションが終了します。よって、ApplicationContext.MainFormに指定されているフォームが閉じられる時に、つぎに開くフォームをApplicationContext.MainFormに指定すれば、メインフォームを次々と入れ替えて表示することができます。


Public Class Main


 

    Private Shared _MainApplicationContext As ApplicationContext


 

    'アプリケーションエントリーポイント

    Public Shared Sub Main()


 

        'アプリケーションコンテキストオブジェクトを作成します。

        _MainApplicationContext = New ApplicationContext


 

        'XPスタイルに設定します。

        Application.EnableVisualStyles()


 

        'ログイン画面をを表示します。

        Dim frmLogin As New LoginForm

        AddHandler frmLogin.FormClosed, AddressOf frmLogin_FormClosed

        p_MainApplicationContext.MainForm = frmLogin

        Application.Run(_MainApplicationContext)


 

    End Sub


 

    'ログイン画面を閉じた時の処理です。

    Private Shared Sub frmLogin_FormClosed(ByVal sender As ObjectByVal e As FormClosedEventArgs)

        'メインメニューを表示します。

        If CType(sender, Form).DialogResult = DialogResult.OK Then

            Dim frmMainMenu As New MainMenu

            _MainApplicationContext.MainForm = frmMainMenu

            frmMainMenu.Show()

        End If

    End Sub

    

End Class

2007年5月25日金曜日

.NET 画像表示いろいろ

画像系はあまり使うことがないので、すぐに忘れてしまいます。

ファイルからバイト配列を取得する。
Dim bytes() As Byte 
Using fs As New System.IO.FileStream("パス", IO.FileMode.Open, IO.FileAccess.Read)
Using br As New System.IO.BinaryReader(fs)
bytes = br.ReadBytes(CInt(fs.Length))
br.Close()
End Using
fs.Close()
End Using


ファイルからImageオブジェクトを取得する。
Dim image As System.Drawing.Image 
Using fs As New System.IO.FileStream("パス", System.IO.FileMode.Open)
image  = System.Drawing.Image.FromStream(fs)
fs.Close()
End Using


バイト配列からImageオブジェクトを取得する。
Dim bytes() as Byte = 画像のバイト配列
Dim image As System.Drawing.Image 
Usind ms As New System.IO.MemoryStream(bytes)
image = System.Drawing.Image.FromStream(ms)
ms.Close()
End Using



ピクチャーボックスに表示された画像のバイト配列を取得する。
Using ms As New System.IO.MemoryStream()
Me.PictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp)
Dim bytes(Cint(ms.Length)) As Byte
ms.Position = 0
ms.Read(bytes, 0, Convert.ToInt32(ms.Length))
ms.Close()
End Using


上記の「ファイルからImageオブジェクトを取得する」や「バイト配列からImageオブジェクトを取得する」で取得したImageオブジェクトをPictureBoxのImageプロパティにそのまま設定すると、「ピクチャーボックスに表示された画像のバイト配列を取得する」のImage.SaveでGDI+汎用エラーになってしまいます。

この問題を回避するには、取得したImageオブジェクトからBitmapオブジェクトを作成してPictureBoxのImageプロパティに設定します。

Me.PictureBox1.Image = New System.Drawing.Bitmap(取得したImageオブジェクト)

2007年5月21日月曜日

.NET XPスタイルにする

過去記事スタートアップオブジェクトをSub MainにするでアプリケーションのエントリーポイントをSub Mainにしました。

Windowsアプリケーションプロジェクトのプロパティよりアプリケーションタブを表示し、「アプリケーションフレームワークを有効にする」チェックボックスをOFFにすることで、アプリケーションのエントリーポイントをSub Mainできるわけですが、同時に「アプリケーションフレームワークを有効にする」チェックボックスがONの場合にWindowsアプリケーションフレームワークのプロパティで設定できるXPスタイルの設定やスプラッシュウインドウの表示などを、自分で定義しないといけません。

XPスタイルにするにはSub MainにApplication.EnableVisualStylesの一文を追加します。

Public Class Main Public Shared Sub Main() 'XPスタイルにする。 Application.EnableVisualStyles() 'Form1を起動します。 Application.Run(New Form1()) End Sub End Class

雑記 Windowsの自動更新でCPUが100%になる問題

家のPCの起動が遅くなりました。
タスクバーを見るとCPUの使用率が100%になっておりsvchost.exeがCPUを占有しているようです。
Windowsの自動更新でこのような現象が出るようです。

この問題は「マイクロソフト」からKB927891という修正プログラムとWindows Update Agent 3.0 をインストールすることで解決します。

2007年5月18日金曜日

.NET アプリケーション設定ファイル ~プロジェクト間で共有 その2~

それではアプリケーション設定ファイル ~プロジェクト間で共有 その1~で作成したクラスを利用して、ユーザー設定の編集画面、アプリケーション設定の表示画面を作成してみましょう。

ソリューション
|
|-StartUpプロジェクト(Windowsアプリケーション)
|    |-参照設定:Aプロジェクト、共通プロジェクト
|    |--app.config
|    |--Main.vb(Sub Main)
|
|-共通プロジェクト(クラスライブラリ)
|    |-SettingReader.vb
|
|-Aプロジェクト(クラスライブラリ)
|    |-参照設定:共通プロジェクト
|    |-ユーザー設定変更Form
|    |-アプリケーション設定表示Form

Aプロジェクトにユーザー設定変更Formとアプリケーション設定表示Formを追加します。
ユーザ設定変更Formにはフォーム背景色変更ボタン、保存ボタン、終了ボタンを用意します。
アプリケーション設定表示フォームにはProviderName表示用テキストボックス、ConnectionString表示用テキストボックス、終了ボタンを用意します。

ユーザー設定変更Formのコード

Public Class UserSettingSample




    'FormLoadイベント

    Private Sub UserSetting_Load(ByVal sender As ObjectByVal e As System.EventArgs) _

    Handles Me.Load

        'ユーザ設定ファイルよりフォーム背景色を設定します。

        Me.BackColor = 共通プロジェクト.SettingReader.FormBackColor

    End Sub




    '背景色選択ボタンクリックイベント

    Private Sub cmdColor_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) _

    Handles cmdColor.Click

        Using cd As New System.Windows.Forms.ColorDialog

            cd.Color = Me.BackColor

            If cd.ShowDialog = Windows.Forms.DialogResult.OK Then

                'フォームの背景色を選択色に変更します。

                Me.BackColor = cd.Color

            End If

        End Using

    End Sub




    '保存ボタンクリックイベント

    Private Sub cmdEntry_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) _

    Handles cmdEntry.Click

        'ユーザ設定ファイルにフォームの背景色を設定します。

        共通プロジェクト.SettingReader.FormBackColor = Me.BackColor

        '設定ファイルの変更を保存します。

        共通プロジェクト.SettingReader.SettingInstance.Save()

    End Sub




    '終了ボタンクリックイベント

    Private Sub cmdExit_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles cmdExit.Click

        Me.Close()

    End Sub




End Class


アプリケーション設定表示Formのコード

Public Class AppSettingSample


 

    'Loadイベントです。

    Private Sub AppSettingSample_Load(ByVal sender As ObjectByVal e As System.EventArgs) _

    Handles Me.Load

        'アプリケーション設定ファイルよりProviderNameを表示します。

        Me.txtProviderName.Text = 共通プロジェクト.SettingReader.ProviderName

        'アプリケーション設定ファイルよりConnectionStringを表示します。

        Me.txtConnectionString.Text = 共通プロジェクト.SettingReader.ConnectionString

    End Sub


 

    '終了ボタンクリックイベントです。

    Private Sub cmdExit_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) _

    Handles cmdExit.Click

        Me.Close()

    End Sub


 

End Class

ユーザ設定画面を起動し、フォームの背景色を変更し保存します。アプリケーションを終了し再度実行すると、先ほど保存した背景色でフォームが表示されます。別ユーザでログインした場合は、先ほど保存した背景色ではなく設定ファイルのデフォルト値で表示されます。

2007年5月15日火曜日

.NET データベースアクセス

現在、データベースアクセスの汎用クラスを作成しています。

データベースアクセス部分をプログラミングする方法として、下記のように色々な方法があります。
・カスタムエンティティを使用する。
・DataSetを使用する。
・DataSetを内包するカスタムエンティティを使用する。
それぞれメリット、デメリットがあり、システムやチームメンバーの習熟度により、どの方法を使用するか選択します。

前回のシステムではカスタムエンティティ取り入れた方法を選択しました。
しかしチームメンバーのほとんどがJava等のオブジェクト指向言語が未経験かつ.NET開発も未経験という方たちで、それぞれのPGが独自の方法でデータベースからデータを取り出し、独自の方法で更新しているという収集のつかない状態に・・・。そして開発が一段落ついた頃、外注PGは自社に戻り、派遣PGであった私が全体の保守を行うことになりました。本当に厳しく辛い日々でした。

そしてPGである私は設計者に「設計ルールの必要性」を解くことから始まりました。設計ルールの必要性はすぐに理解していただけました。
そのとき設計者が言ったことは
「今回のシステムで思った事だけど、業務アプリの場合はよほど酷いルールでなければ、それなりに動くものができる。ルールを作って守らす事が、後々の保守のためにも必要だ。」
(えっ!?今頃気づいたのですか?)

まず命名規則を決めました。
(過去記事にも書きましたが、ハンガリアン表記法の半導入です!!)
我流の例外処理の記述を決め
(過去記事にも書きましたが、なんでもかんでも例外キャッチ!!)
そして最も重要なデータベースアクセス部分のルール決めに突入しました。
紆余曲折があり長い時間をかけ色々と話し合いました。

個人的には型付データセットを使用した更新を勧めたのですが、「ウィザードで作成する」部分で却下されました。(正直な所、私もウィザードは好きではありません。が、せっかくNetが用意してくれる便利な機能を使わないのは勿体無いなぁと思います。)結局、落とし所を探って我流データアクセスロジックが決定しました。

Formと1対1となるようなクラスを作成する。(以降FormManagerクラス)
DBテーブルごとにクラスを作成する。(以降DbTableクラス)
FormManagerクラスの役割は
・Formに表示するデータを取得する。(SQLを作成し実行。)
・Formから受け取ったデータを各DbTableクラス単位に分割し、各DbTableクラスの更新処理を呼び出す。
・トランザクションを管理する。
DbTableクラスの役割は
・DB更新処理。
クラス間のデータの受け渡しには、簡易型付データセットを使用します。
これはウイザードで作成せずに、自前で用意します。

そして現在、上記ルールで作成したデータアクセス部分のサンプルを作成しています。
サンプルを作成してて思ったことですが
Netの場合はFormに表示する内容はVIEWを作成し、更新はストアドが一番いい
もちろん設計者には管理が大変なので却下されました。

いつか決定権が持てたら
VIEWとストアドでシステムを組んでみたいです。

2007年5月14日月曜日

.NET アプリケーション設定ファイル ~プロジェクト間で共有 その1~

プロジェクトのプロパティの設定タブでアプリケーションの設定を行うことができます。
アプリケーションの設定にはアプリケーションスコープとユーザースコープの2種類があります。

アプリケーションスコープはアプリケーション全体の設定で読み取り専用です。
ユーザースコープはログインユーザごとの設定で読み書き可能です。

プロジェクトの設定プロパティで設定を行うと、同プロジェクトの「My Project」フォルダ内に「Settings.settings」ファイルが自動で作成されます。全てのファイルを表示を選択しないと見れません。また同プロジェクト内にapp.configがなければapp.configファイルが作成されます。

Settings.settingsファイルのSettings.Desiner.vbを見てもらうとわかりますが、このファイルはSystem.Configuration.ApplicationSettingsBaseから派生したMySettingsクラス定義ファイルでMy.MySettings.Default.設定名で設定内容にアクセスするためのクラスです。実際の設定内容はapp.configに保存されます。System.Configuration.ApplicationSettingsBaseクラスはapp.configに簡単にアクセスするために用意されたクラスです。詳しくは「アプリケーション設定ファイル」でググってくださいね。


実際に使用するといくつか問題がありました。
My.MySettings.Default.設定名でアクセスできるのは設定を行ったプロジェクト内のクラスでのみです。以下のようなソリューション構成の場合、共通プロジェクトで行った設定内容は共通プロジェクト内のクラスからはMy.MySettings.Default.設定名でアクセスできますが、AプロジェクトやBプロジェクトからはアクセスできません。

またWindowsアプリケーション(以下のStartUpプロジェクト)にアプリケーション設定を行った場合、インストール時にapp.configはexeファイルと同じフォルダにアプリケーション名.exe.configという名前で保存されます。しかしクラスライブラリ(以下の共通、A、Bプロジェクト)にアプリケーション設定を行った場合、インストール時にapp.configはdll内に取り込まれてexeファイルと同じフォルダにconfigファイルは作成されません。これではインストール後に設定ファイルの内容を変更するためには再度dllを作成し配布しなければなりません。

ソリューション
|
|-StartUpプロジェクト(Windowsアプリケーション)
| 
|  参照設定:共通プロジェクト、Aプロジェクト、Bプロジェクト
|
|-共通プロジェクト(クラスライブラリ)
|
|-Aプロジェクト(クラスライブラリ 
|  参照設定:共通プロジェクト
|
|-Bプロジェクト(クラスライブラリ)
|  参照設定:共通プロジェクト


どうすればいいのか、かなり悩みました。

まず最初に試した方法ですが、
StartUpプロジェクトにアプリケーション設定を行います。
するとStartUpプロジェクトにapp.configとSettings.settingが作成されます。
Settings.Desiner.vb(MySettingsクラス)を見るとスコープがFriendです。単純にこれをPublicにすれば外部公開できますね。でもこの方法では設定を変更する度にFriendクラスに戻ってしまいます。その上、AプロジェクトからStartUpプロジェクトのMySettingsクラスにアクセスするためには、Aプロジェクトの参照設定にMainプロジェクトを追加しなければなりません。う~ん循環参照ですね。

次に試した方法ですが、この方法で外部プロジェクトからも参照設定可能です。
StartUpプロジェクトにアプリケーション設定を行います。
するとStartUpプロジェクトにapp.configとSettings.settingが作成されます。
それから共通プロジェクトにSettingsReaderクラスを作成します。
このクラスにSystem.Configuration.ApplicationSettingsBaseの受け渡しをする静的プロパティを用意します。そしてStartUpプロジェクトのスタートアップオブジェクトであるSub MainからSettingReaderのプロパティにMy.MySetting.Defaultを渡してあげます。

StartUpプロジェクトのプロパティより設定タブを選択し以下のような設定を追加します。
【設定1】
名前:ProviderName
型:String
スコープ:アプリケーション
値:System.Data.OracleClient
【設定2】
名前:ConnectionString
型:(接続文字列)
スコープ:アプリケーション
値:Data Source=xxx;User ID=xxx;Password=xxx;
【設定3】
名前:FormBackColor
型:System.Drawing.Color
スコープ:ユーザー
値:255, 255, 192


共通プロジェクト.SettingReader.vb

Public Class SettingReader


 

    Private Shared p_SettingInstance As _

                Global.System.Configuration.ApplicationSettingsBase


 

    Public Shared Property SettingInstance() As _

                Global.System.Configuration.ApplicationSettingsBase

        Get

            Return p_SettingInstance

        End Get

        Set(ByVal value As Global.System.Configuration.ApplicationSettingsBase)

            p_SettingInstance = value

        End Set

    End Property


 

    '--Application Scope--

    '--Application Scopeは Getterのみ記述--


 

    Public Shared ReadOnly Property ProviderName() As String

        Get

            Return CType(p_SettingInstance.Item("ProviderName"), String)

        End Get

    End Property


 

    Public Shared ReadOnly Property ConnectionString() As String

        Get

            Return CType(p_SettingInstance.Item("ConnectionString"), String)

        End Get

    End Property


 

    '--UserScope--

    '--UserScopeは Getter Setterを記述--


 

    Public Shared Property FormBackColor() As System.Drawing.Color

        Get

            Return CType(p_SettingInstance.Item("FormBackColor"), System.Drawing.Color)

        End Get

        Set(ByVal value As System.Drawing.Color)

            p_SettingInstance.Item("FormBackColor") = value

        End Set

    End Property


 

End Class


StartUpプロジェクト.Main.vb

Public Class Main


 

    Public Shared Sub Main()

        Common.SettingReader.SettingInstance = My.MySettings.Default

        Application.Run(New Form1())

    End Sub


 

End Class

2007年5月13日日曜日

Blogger ブログのソースコードをハイライト表示してみる

Blogger でも、コードハイライト してみる。by google-code-prettify
リンク先を参考にgoogle-code-prettifyでハイライト表示を試してみたのですが、うまくいきませんでした。丁寧に説明してくださっているのに・・・なんで出来ないんだろう?


[Visual Studio]CopySourceAsHtml VS2005日本語版対応版
リンク先をを参考にCopySourceAsHtml VS2005も試したのですがHTMLに変換でエラーがでるんです。

結局SourceConverter+CSSでなんとか表示できました。
ですが<pre>~</pre>タグないでソースコードの連続する空白行が無視されるんです。
仕方ないので<br>+全角スペースで対応してます。
ちなみに連続する空白行を無視しないよう設定で変更できるのですが、これまた意図する表示ではないです。

2007年5月12日土曜日

雑記 ダイアグラム別UML徹底活用

ダイアグラム別UML徹底活用
井上 樹著
翔泳社 (2005.6)
通常1-3週間以内に発送します。



【感想】
じつはまだ読みきっていません。
ゆっくり読みたいと思います。

雑記 NETエンタープライズWebアプリケーション開発技術大全

.NETエンタープライズWebアプリケーション開発技術大全 Vol.2
赤間 信幸著
日経BPソフトプレス (2004.6)
通常2-3日以内に発送します。


.NETエンタープライズWebアプリケーション開発技術大全 Vol.3
赤間 信幸著
日経BPソフトプレス (2004.6)
通常2-3日以内に発送します。


.NETエンタープライズWebアプリケーション開発技術大全 Vol.4
赤間 信幸著
日経BPソフトプレス (2004.10)
通常2-3日以内に発送します。


.NETエンタープライズWebアプリケーション開発技術大全 Vol.5
赤間 信幸著
日経BPソフトプレス (2005.3)
通常2-3日以内に発送します。


【感想】
某掲示板でWindowsアプリケーションにも役立つと紹介され、Vol.2~Vol.5まで購入しましたが
正直な所、Windowsアプリケーション開発には役立つことはありませんでした。
ASP.NETの開発に備えて勉強します。

雑記 プログラミングMicrosoft ADO.NET

プログラミングMicrosoft ADO.NET (CD-ROM付)
David Sceppa著 / 日本ユニテック訳
日経BPソフトプレス (2002.11)
通常1-3週間以内に発送します。



【感想】
良書です!
ADO.NETについて詳しく解説されています。
ボリュームはありますが、決して難しくありません。
翻訳書にありがちな読みにくさもなく、ADO.NETについてはこの1冊で十分理解できます。

2007年5月11日金曜日

.NET OracleのフィールドにDbNull.Valueを登録する際の注意

今日は不思議な事象にはまりました。
自力理解ができないので?@ITに投稿してみました^^;


現象
パラメータを使用して複数件のデータをOracleデータベースに更新する際、パラメータのDbTypeを設定せずに更新クエリーを実行するとOracleExceptionがThrowされる場合があります。

例えば、OracleテーブルのDate型フィールドに2件のデータを登録するとします。
1件目のデータがNowであれば更新クエリーは成功します。
 1件目:Now
 2件目:DbNull.Value

1件目のデータがDbNull.Valueであれば更新クエリーは2件目のデータを更新する際にOracleExceptionをThrowします。
 1件目:DbNull.Value
 2件目:Now

ThrowするException
ORA-01861: リテラルが書式文字列と一致しません。

パラメータのDbTypeを設定すれば例外はThrowされません。
SQLServerでは発生しないようです。


サンプルコード

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click


 

        'データテーブルオブジェクトを作成します。

        Dim table As New DataTable

        table.Columns.Add(New DataColumn("TESTDATE"GetType(Date)))

        Dim row As DataRow


 

        'データテーブルに1件目のデータを追加します。

        row = table.NewRow

        row("TESTDATE") = DBNull.Value

        table.Rows.Add(row)


 

        'データテーブルに2件目のデータを追加します。

        row = table.NewRow

        row("TESTDATE") = Now

        table.Rows.Add(row)


 

        'コネクションオブジェクトを作成します。

        Dim cnn As New OracleClient.OracleConnection

        cnn.ConnectionString = "接続文字列"


 

        'コマンドオブジェクトを作成します。

        Dim cmdInsert As New OracleClient.OracleCommand

        cmdInsert.Connection = cnn

        cmdInsert.CommandText = "INSERT INTO TESTTABLE (TESTDATE) VALUES (:TESTDATE)"


 

        'パラメータを作成します。

        Dim prm As New OracleClient.OracleParameter

        prm = cmdInsert.CreateParameter

        '--DbTypeを指定しないとExceptionが発生します。--

        prm.DbType = DbType.Date

        prm.ParameterName = "TESTDATE"

        prm.SourceColumn = "TESTDATE"

        cmdInsert.Parameters.Add(prm)


 

        'データテーブルの変更をデータベースへ反映します。

        Dim adp As New OracleClient.OracleDataAdapter

        adp.InsertCommand = cmdInsert

        adp.Update(tbl)

    End Sub


MSDNでOracleParameter.DbType プロパティを確認すると
パラメータの DbType プロパティ、OracleType プロパティ、および.Data.OracleClient.OracleParameter.Size プロパティは、.Data.OracleClient.OracleParameter.Value を設定することによって推論できます。したがって、これらを指定する必要はありません。とありました。

パラメータはValue値からDbTypeを推論します。
Oracle® Data Provider for .NET開発者ガイド の「ValueからのDbTypeおよびOracleDbType」の推論によると.Netデータ型がDateTimeのときOracleDbTypeはTimeStampを推論するようです。

つまり1件目のデータのパラメータValue値がDbNull.Valueの場合、OracleDbTypeをTimeStampと推論し2件目のデータでOracleDbTypeがDate型のデータをInsertしようとして例外がスローされるようです。
1件目のデータのパラメータValue値がDbNull.Value以外であればOracleDbTypeはDate型を推論するため、1件目のデータがNowであれば例外はスローされないということのようです。

2007年5月10日木曜日

.NET FrameWork3.0

.Net Framework3.0についてもう少し詳しく調べてみました。

.Net Framework3.0で追加されたコンポーネント
・Windows Presentation Foundation
・Windows Communication Foudation
・Windows Workflow Foundation
・Windws CardSpace


Windows Presentation Foundation(WPF)について
WPF(コードネーム:Avalon)は.NET FrameworkのGUI部分を司るコンポーネント。
・3Dを用いたGUIを実現できる。
・WPFの特徴の1つは、XAML(Extensible Application Markup Language:ザメル/ザムル)と呼ばれる言語を用いてアプリケーションのUIを記述できる。XAMLはXMLベースの言語で、ボタンや2D/3D描画のためのコンポーネントを、XMLのタグを用いて表現する。これによりデザインとロジックが分離されWebアプリケーション開発では一般的だが、スタンドアロンアプリケーションではあまり重視されてこなかった、デザイナと開発者の分業開発が可能となる。

参考サイト
http://codezine.jp/a/article/aid/910.aspx


Windows Communication Foudation(WCF)について
WCF(コードネーム:Indigo)は、.NET Framework 3.0の通信部分を司るコンポーネント。
分散アプリケーション技術におけるアプリケーション間の連携を行うための技術。1マシン上でのプロセス間通信、Windowsマシン間のネットワークをまたがった通信、Webサービスを使用した他のプラットフォーム間との通信などにおいて、従来であれば各アプリケーションが採用した技術ごとに異なるコーディングを行う必要があったが、WPFでは設定ファイルに通信方式を定義し、設定ファイルの変更だけで基本的な実行コードは同じという統一されたコーディングが可能となる。

参考サイト
http://codezine.jp/a/article/aid/910.aspx
http://www.atmarkit.co.jp/fdotnet/wcf/index/index.html


Windows Workflow Foundation(WF)について
Windowsでワークフローを作成するための技術基盤。
システムワークフロー、ヒューマンワークフローの両方に対応したワークフローを作成できる。
デザイン画面で作成したワークフローはコードファイルとして保存されコンパイルして処理が実行される。
コードはワークフローデザイナでダブルクリックすることで記述し、ワークフローとコードの分離が可能となる。

参考サイト
http://www.atmarkit.co.jp/fdotnet/special/winworkflow/winworkflow_01.html


Windws CardSpace(WCS)について
WCSは(コードネーム:InfoCard)、インターネット上でのIDの管理、制御、交換のためのシステム。
ユーザー名とパスワードを使用した従来の認証方法ではフィッシングなどの攻撃があるためパスワードを盗まれる可能性がある。WSCを使用することで現実世界同様に第三者機関(自分も含む)が発行したオンライン上のIDカードにより認証を行う仕組み。
Internet Explorer 7でWindows CardSpaceはサポートされる。
Vistaのみならず、Windows XP SP2、Windows Server 2003 SP1にも提供される予定。

参考サイト
http://blog.japan.zdnet.com/tokuda/a/2007/02/window_vistams_2.html
http://www.microsoft.com/japan/msdn/net/general/IntroInfoCard.aspx



.NET Framework 3.0新技術の使い分け指針
http://www.atmarkit.co.jp/fdotnet/special/dotnetfx3002/dotnetfx3002_03.html

Windows Vista時代のユーザー・インタフェースの作り方
http://itpro.nikkeibp.co.jp/article/COLUMN/20061117/254083/?ST=win&P=1

2007年5月7日月曜日

GrapeCityTool ElTanelle 4.0J

GrapeCity製のWorkSheet4.0の拡張コンボボックスエディタについてのメモです。


拡張コンボボックスをValueAsIndex=Falseにしていた場合、ValueMemberの「型」とDataFieldに設定するMappingの「型」を合わせないとエラーになります。

具体的に説明すると
拡張コンボボックスのValueMemberにはListItemクラスのCd(Object)が設定されています。
拡張コンボボックスを設定した1列目にはDataTableの「FIELD1」DataColumnが表示されます。
拡張コンボボックスのValueAsIndex=Falseを設定しないと拡張コンボボックスの選択値はIndexで選択されてしまいます。例えばFIELD1の値が「3」のとき、拡張コンボボックスのドロップダウンアイテムからインデックス3(=4つ目のアイテム)を選択しようとします。CD=3に該当するアイテムを選択したい場合はValueAsIndex=Falseを設定します。

'Form1クラスです。
Public Class Form1
  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Me.Load
    '拡張コンボボックスのデータを作成します。
    Dim list As New List(Of ListItem)
    For idx As Integer = 1 To 10
      list.Add(New ListItem(i,"List_" & i.ToString)
    Next
    '拡張コンボボックスエディタを作成します。
    Dim cbo As New GrapeCity.Win.ElTabelle.Editors.SuperiorComboEditor
    With cbo 
      .DataSource = list
      .DisplayMember = "Name"
      .ValueMember = "Cd"
      .ValueAsIndex = False
    End With
    '拡張コンボボックスエディタをシートの1列目に設定します。
    Me.Sheet1.Columns(0).Editor = cbo  
    'シートに表示するデータを作成します。
    Dim sql As String = "SELECT FIELD1 FROM TABLE1"
    Dim connection As New System.Data.OleDb.OleDbConnection("接続文字列")  
    Dim adapter As New System.Data.OleDb.OleDbDataAdapter(sql, connection)
    Dim table As New DataTable
'このコードを入れないとエラーになります。
    table.Columns.Add(New DataColumn("FIELD1",GetType(Integer)))
adapter.Fill(table)
    'シートにデータを設定します。
    Me.Sheet1.DataSource = table
    Me.Sheet1.Columns(0).DataField = "FIELD1"
  End Sub
End Class


'コードとコードに対応する名前を保持するクラスです。
Public Class ListItem
Private _Cd As Object
private _Name As String
Public Sub New(cd As Object,name As String)
Me._Cd = cd
Me._Name = name
End Sub
Public Property Cd() As Object
Get
Return Me._Cd
End Get
Set(ByVal value As Object)
Me._Cd = value
End Set
End Property
Public Property Name() As String
Get
Return Me._Name
End Get
Set(ByVal value As String)
Me._Name = value
End Set
End Property
End Class

2007年5月1日火曜日

.NET DataRowの各フィールド値をカンマ区切りの文字列にするには

Join(datarow.ItemArray, ",")

.NET 現在実行中のメソッド名を取得するには

System.Reflection.MethodBase.GetCurrentMethod().Name

.NET TypedDataSetの削除された行にアクセスする

私は型指定されたDataSetの一番の利点はインテリセンス機能だと思っています。

型指定されていないDataSetで各フィールド値にアクセスする場合は以下のように書きます。
dataRow("hogehoge")
型指定されているDataSetで各フィールド値にアクセスする場合は以下のように書きます。
dataRow.hogehoge
datarowと書いて「.」をポチッとするとフィールド一覧が出てきてコードを書くのに大変助かります。

今日は型指定されたDataSetで削除された行にアクセスする必要がありました。
私は削除された行にアクセスするには、きっと
datarow.hogehoge(DataRowVersion)
みたいなコードがあると思っていました。
絶対にあるはずだと勝手に思い込んでいました。

デザイナが作成するコードを見ても、そんなものはまったくありません。
それでも自分が信じられなくてググッてみました。


削除された行へのアクセスは型指定されていないDataSetと同じ方法になるのですね・・・。
datarow("hogehoge",DataRowVersion.Original)

なんだかなぁ。