2008年8月28日木曜日

.NET VisualStudioからAccessを操作する際の注意点

VisualSutdioからAccessを操作する場合、知らないと色々とハマることが多いです。

1.DbParameterでAccessの時間を含む日付型フィールドのパラメータを作成できない

2.SQLのJOIN句には括弧が必要。
SELECT * FROM ((TABLE1
INNER JOIN TABLE2 ON TABLE1.CD = TABLE2.CD)
INNER JOIN TABLE3 ON TABLE1.CD = TABLE3.CD)

3.名前付きパラメータであっても、設定する順番が重要。疑問符(?)で指定する位置指定パラメータが適用される。
Dim sql As String = "SELECT * FROM TABLE1 WHERE CD=@CD AND NAME=@NAME"
Dim cmd AS DbCommand = 略
cmd.CommandText = sql

Dim prm1 As DbParameter = cmd.CreateParameter
prm1.ParameterName = "CD"

Dim prm2 As DbParameter = cmd.CreateParameter
prm2.ParameterName ="NAME"

'Sqlのパラメータの順序通りに追加する必要がある。
cmd.Parameters.Add(prm1)
cmd.Parameters.Add(prm2)
’順番を変えるとエラーになる。
cmd.Parameters.Add(prm2)
cmd.Parameters.Add(prm1)

.NET DbParameterでAccessの時間を含む日付型フィールドのパラメータを作成できない

Accessデータベースの日付型フィールドを、System.Data.Common.DbParameterで処理する際
DbTypeプロパティの設定に注意する必要があります。

日付型フィールドに時間を含まない場合、
DbParameterのDbTypeプロパティはDbType.Dateで問題なく動作しますが
日付型フィールドに時間を含む場合、
DbParameterのDbTypeプロパティをDbType.DateTimeにすると「OleDbException:抽出条件でデータ型が一致しません。」と例外が発生します。


DbParameterをOleDbParameterにキャストしOleDbType.Dateを指定しなければいけません。

Dim setting As ConnectionStringSettings
setting = ConfigurationManager.ConnectionStrings("MyAccessDb")

Dim factory As DbProviderFactory
factory = DbProviderFactories.GetFactory(setting.ProviderName)

Using cnn As DbConnection = factory.CreateConnection
cnn.ConnectionString = setting.ConnectionString
Using cmd As DbCommand = factory.CreateCommand
cmd.Connection = cnn
cmd.CommandText = "INSERT INTO MyTable (MyDate) Values (@MyDate)"
Dim prm As DbParameter = factory.CreateParameter
prm.ParameterName = "MyDate"
'時間を含む日付パラメータ
prm.DbType = DbType.DateTime
     If TypeOf (prm) Is OleDb.OleDbParameter AndAlso dbtype = Data.DbType.DateTime Then     
CType(prm, OleDb.OleDbParameter).OleDbType = OleDb.OleDbType.Date
End If
prm.Value = Me.DateTimePicker1.Value
cmd.Parameters.Add(prm)

cnn.Open()
Try
cmd.ExecuteNonQuery()
Finally
cnn.Close()
End Try
End Using
End Using

2008年8月20日水曜日

.NET DbConnection.GetSchemaメソッドでテーブル一覧を取得するには?

GetOleDbSchemaTable と Visual Basic .NET を使用してスキーマ情報を取得する方法

Accessデータベースのテーブル一覧を取得する方法。
Using cnn As DbConnection = 省略
cnn.Open()
Try
Dim dt As DataTable
dt = cnn.GetSchema("Tables", New String() {Nothing, Nothing, Nothing, "TABLE"})

For row As Integer = 0 To dt.Rows.Count - 1
For col As Integer = 0 To dt.Columns.Count - 1
Console.WriteLine("[{0},{1}]={2}", row, col, dt.Rows(row).Item(col).ToString)
Next
Next
Finally
cnn.Close()
End Try
End Using 'cnn

2008年8月18日月曜日

.NET Vista対応 その5 ビルド時にマニフェストファイルを埋め込む

Vista対応 その2 マニフェストファイルを使用するで「マニフェストファイルをプログラムファイルに埋め込む」方法を記載しました。
この方法以外にビルド時にビルド後アクションとしてマニフェストファイルを埋め込む方法を紹介します。

1、マニフェストを埋め込むWindowsアプリケーションプロジェクトに同名のマニフェストファイルを追加します。


2、Windowsアプリケーションのプロパティより「コンパイルタブ」の「ビルドイベント」ボタンをクリックします。


3、「ビルド後に実行するコマンドライン」にマニフェストファイルを埋め込むビルドアクションを設定します。


"$(DevEnvDir)..\..\SDK\v2.0\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest" -outputresource:"$(TargetDir)$(TargetFileName)";#1
"$(DevEnvDir)..\..\SDK\v2.0\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest" -outputresource:"$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)";#1


※注意点
インストーラのプライマリ出力は\obj\[debug|release]\に作成されるexeを対象としてます。
\bin\[debug|release]\ではないので注意してください。
ビルド後イベントでは\obj\[debug|release]\に作成されるexeと、\bin\[debug|release]\に作成されるexeの両方にマニフェストファイルを埋め込んでいます。

2008年8月1日金曜日

.NET IntegerとLongの数値範囲

メモ
範囲
Int16-32,768 から +32,767 までの値の符号付き整数
Int32(Integer)-2,147,483,648 から +2,147,483,647 までの値の符号付き整数
Int64(Long)-9,223,372,036,854,775,808 から +9,223,372,036,854,775,807までの値の符号付き整数