異邦人になってみた~上海の人blog

上海在住です。上海情報満載です。また中国時代劇をよく見ています、中国旅行の事、weiboやQQの設定、一眼レフカメラの写真掲載、上海での日々の生活情報を書いています

 このブログについて(about)
 

 中国旅行記(体験談)


 スポンサーリンク

VBからMDBのインサートで「抽出条件でデータ型が一致しません」が出る件

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がフリーズというか落ちるようになりました。。
とっても怪しい感じがします。いろいろと恐るべしです。