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を指定しなければいけません。
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
.NET DbConnection.GetSchemaメソッドでテーブル一覧を取得するには?
GetOleDbSchemaTable と Visual Basic .NET を使用してスキーマ情報を取得する方法
Accessデータベースのテーブル一覧を取得する方法。
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
.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の両方にマニフェストファイルを埋め込んでいます。
この方法以外にビルド時にビルド後アクションとしてマニフェストファイルを埋め込む方法を紹介します。
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の両方にマニフェストファイルを埋め込んでいます。
.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までの値の符号付き整数 |
登録:
投稿 (Atom)
-
DataTableから重複を除くには と DataTableの集約計算を行う(Compute) を利用して、DataTableをグループ化し集計を行います。 以下のようなデータが入ったDataTableから、Field1とField2で重複を取り除き集計をおこないます。...
-
前回「 PLSQL SELECTの結果を取得する ~取得結果が1行の場合~ 」に続き 今回はSELECTの結果が複数行の場合です。 SELECTの結果が複数行の場合はカーソルを使用します。 カーソルとは SELECTの結果セットに対して、1行ずつデータを取り出し、順次...
-
datatableの集約計算を行うにはDataTable.Compute メソッドを使用します。 Dim As Object '最大値を求める value = datatable.Compute("Max(集計列名)", Nothing) ...