ASP,VBSでAccessデータベース操作
SQL文でデータをAccessへ書き込み、読み込み実行時のデータ型変換(日付、数値、文字列)の注意。

Accessへ書き込む時にデータ型を間違えると
読み込み時にデータ型が一致しないエラーがでる。
書き込み時、読み込み時のデータ型を一致させよう。

前回以下のようなプログラムを作成して、Accessへデータ型を書き込んだが、SQL文のWHEREでデータ条件を設定して読み込もうとしたら、データ型が一致しませんとエラーがでた。

strtmp=Split(str,chr(10))
Set db=Server.CreateObject("ADODB.Connection")
db.Provider="Microsoft.Jet.OLEDB.4.0"
db.Mode=2
db.ConnectionString=Server.MapPath("kabu.mdb")
db.Open
SQL="INSERT INTO 日経(日付,日経平均,NYダウ,ナスダック,ドル) VALUES('"&strtmp(0)&"','"&strtmp(1)&"','"&strtmp(2)&"','"&strtmp(3)&"','"&strtmp(4)&"')"
Response.Write SQL&"<br>"
db.Execute(SQL)
db.Close
Set db = Nothing

Accessへの書き込み時のSQL文は以下の通り。
INSERT INTO 日経(日付,日経平均,NYダウ,ナスダック,ドル) VALUES('2009/08/28','10,534.14','9,580.63','2,027.73','93.91')

以下のSQL文を実行しようとしたら、データ型が一致しませんとエラー。
SQL1="DELETE FROM 日経 WHERE 日付='2009/08/28'"

Accessでの日付のデータ型の設定は日付/時刻型である。


何がいけなかったのかというと、書き込み時に日付をシリアル値(数値)にしなければいけないこと。
また、読み込み時もシリアル値(数値)で読み込まなければならないこと。

INSERT INTO 日経(日付,日経平均,NYダウ,ナスダック,ドル) VALUES(#2009/08/28#,'10,534.14','9,580.63','2,027.73','93.91')

まず、日付の横に#をつけてシリアル化する。
次にシングルコーテーション''をとって数値にする。''をつけると文字列となってしまう。

読み込む時も同じようにする。

SQL1="DELETE FROM 日経 WHERE 日付=#2009/08/28#"

書き込み時も読み込み時も同じようにシリアル化しないとエラーとなる。

注意が必要。

これと同様なことが数値でも起こった。

以下のようなSQL文を書いてもデータ型が違うとエラーが起こった。
SQL2="SELECT * FROM 日経 WHERE 日経平均>10000"

Accessでの日経平均のデータ型は数値型、単精度浮動小数点型としている。

これはINSERT INTOのところで、'10,534.14'と文字列化してしまったことである。

シングルコーテーションをとると10,534.14となり、まだ文字列。

Replace関数で","を""に置換してコンマ","を削除しよう。
strtmp=Replace(strtmp,",","")

そうすると、10534.14となり数値となる。

ASPの関数はバリアント型のため数値でも文字列でもなりえる。

シングルコーテーション''で囲めば文字列になるが、囲まなければ数値となる。

と言うわけで、書き込み時のSQL文を書き直す。

INSERT INTO 日経(日付,日経平均,NYダウ,ナスダック,ドル) VALUES(#2009/08/28#,10534.14,9580.63,2027.73,93.91)

数値にしたいため全てシングルコーテーション'を削除し、日付は両脇に#をつけてシリアル化する。

ASPのプログラムも以下のように変更したところうまくいった。

SQL="INSERT INTO 日経(日付,日経平均,NYダウ,ナスダック,ドル) VALUES(#"&strtmp(0)&"#,"&strtmp(1)&","&strtmp(2)&","&strtmp(3)&","&strtmp(4)&")"

以上でデータ型を一致させることができ、エラーもでなくなった。



実践!ASPでAccess操作