ASP,VBSでAccessデータベース操作 SQL文でデータをAccessへ上書き不可能にする(INSERT SELECT)。

SQL文のINSERT INTO、SELECT FROMを使用して、同じ値がある場合は上書き実行しない。

ASPのSQL文でAccessへ書き込み、読み込みができたので、データの中で日付が同じだったら上書き実行しないプログラムを作成する。

今回はINSERT INTO、SELECT FROMを使用する。

SQLを実行する部分は下記となる。
ASPを動かす全てのソースはこちらからダウンロードしてください。

strtmp=Split(str,chr(10))
Set db=Server.CreateObject("ADODB.Connection")
db.Provider="Microsoft.Jet.OLEDB.4.0"
db.Mode=3
db.ConnectionString=Server.MapPath("kabu.mdb")
db.Open
SQL1="SELECT * FROM 日経 WHERE 日付=#"&strtmp(0)&"#"
Response.Write SQL1&"<br>"
Set rs=db.Execute(SQL1)
If rs.EOF Then
 SQL3="INSERT INTO 日経(日付,日経平均,NYダウ,ナスダック,ドル) VALUES(#"&strtmp(0)&"#,"&strtmp(1)&","&strtmp(2)&","&strtmp(3)&","&strtmp(4)&")"
 Response.Write SQL3&"<br>"
 db.Execute(SQL3)
Else
' SQL2="UPDATE 日経 SET 日経平均="&strtmp(1)&","&"NYダウ="&strtmp(2)&","&"ナスダック="&strtmp(3)&","&"ドル="&strtmp(4)&" WHERE 日付=#"&strtmp(0)&"#"
' Response.Write SQL2&"<br>"
' db.Execute(SQL2)
 ・・・コメントアウト
End If
rs.close
db.Close
Set db = Nothing

前回作った部分で日付がある場合UPDATEしたが、全てコメントアウトしてUPDATEしないようにすれば上書きされない。

日付があればrsに行全てが入る。
日付がないかどうか判断するにはrs.EOFがtrue(1)で判断する。rsが終わり(EOF)であるかどうかを判断する。

If rs.EOF Then
@
Else
A
End If

日付がなければ、@の部分でINSERT INTOでstrtmp(0)〜strtmp(4)の値を日経テーブルに書き込む。
SQL2="INSERT INTO 日経(日付,日経平均,NYダウ,ナスダック,ドル) VALUES(#"&strtmp(0)&"#,"&strtmp(1)&","&strtmp(2)&","&strtmp(3)&","&strtmp(4)&")"
Response.Write SQL3&"<br>"
db.Execute(SQL3)

日付がなければAの部分でUPDATE SETをするようにしたが、コメントアウトして何もしないようにする。

SQLは実行されず、値は変更されないため上書きされない。


実際に書かれるSQL文は以下の通りとなる。

SELECT * FROM 日経 WHERE 日付=#2009/09/03#

以上で、SELECTを使用して同じ日付があるかどうか確認し、あれば上書きしない、なければINSERT INTOを使用して上書きする。

これで、Accessへデータをためることが可能となった。


今回はこれで終了する。

次のテーマとしては、たまったデータをどのように活用するか、クエリをどのように活用するかをやっていこうと思う。



実践!ASPでAccess操作