VisualStudio Community2017のVBでチョイプロを作ってくれといわれたので簡単に受けたんですが、
VBなんていつ振りだろうという感じです。懐かしいですが。。。完全に忘れてます。。。
宣言ってどうするんだっけwwって感じです。
内容は2次元バーコードをスキャンしてDBに書き込むという単純なものでした。
VBアプリなんですが、DBはアクセスだそうです。簡単だろうと思ってましたが、MDB(今でもMDBなのかな?)にデータをINSERTするときにいくつかはまりました。
1つ目はアクセス側のフィールドに日付/時間型にしたとき、「抽出条件でデータ型が一致しません」が出るw
最初、
New OleDbParameter("@workdate",OleDbType.DBTimeStamp)
と設定していたのですが、
値を設定するときにDate(dt)を入れてもだめなようです。こういうの調べてもなかなか出てこないですよね。もうこういう機能自体使う人もいないのでしょうかね?
「抽出条件でデータ型が一致しません」
それから、型を変えるとTimestampとdubleで型が違うとかいろいろ言われ、試行錯誤した末に結局、
New OleDbParameter("@workdate", OleDbType.Variant)
として
timestampParam.Value = dtとするとうまくいきました。
昔は簡単だったんだけど、だんだん複雑になっている気がします。
2つ目は、テーブルのユニークキー(ID)をオートナンバーにしていたのですが、INSERTした際に、INSERT時のIDを取得したく、方法がないかを探していました。
以前ほかのDBではやったことあった気がするのですが、もう忘れてしまって。。。
とりあえずINSERT後、すぐに
[select @@IDENTITY]
すれば取れることがわかりました。スタンドアローンで、タスクやタイマー処理、非同期の処理してないので大丈夫でしょう。
2つ解決するのに相当時間がかかってしまいましたが。。。基本的に大昔作ったものと同じような感じですが、こういうのって時代とともに変わっていくので、各内容ってずいぶん変わってしまいますね。
以下ソースの一部です。
宣言
Public Shared odConnection As OleDbConnection
Public cnnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data source="
Private fileName As String = "D:\PATH\TSU.accdb"
アクセスなのでスタンダードなため、Sharedにしてコネクションを共有するようにしました。
DBを開く
odConnection = New OleDbConnection(cnnStr + fileName)
odConnection.Open()
INSERT部分
'Insert SQL
Dim command As New OleDb.OleDbCommand(sql, odConnection)
command.Parameters.Add(param)Dim dt As Date '実際には値を入れる。
Dim timestampParam = New OleDbParameter("@workdate", OleDbType.Variant)
timestampParam.Value = dt
'INSERT 実行
num = command.ExecuteNonQuery()
command.Parameters.Clear()'SELECT ID SQL(select @@IDENTITY)
Dim command2 As New OleDb.OleDbCommand(sqlid, odConnection)
num = command2.ExecuteScalar()
command2.Parameters.Clear()
ちなみにDATE/TIME型に空のデータを入れたい場合、DBNull.valueを設定します。
それとですが。。。何が悪いのかわかりませんが、プログラム中やたらと開発用PCがフリーズというか落ちるようになりました。。
とっても怪しい感じがします。いろいろと恐るべしです。