|
Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ= を 使った ソースコードを紹介する表示色の説明:ASP VBScriptは <% 〜 %> キーワードはDriver={Microsoft Text Driver (*.txt; *.csv)};DBQ= です。
<%@LANGUAGE=VBScript%>
<html>
<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis">
<title>ADO CSV 接続 ダミーファイルをUNION ALLでつなげた</title>
</head>
<body>
<h1>ADO CSV 接続 ダミーファイルをUNION ALLでつなげた</h1>
test101-2.asp<br>
ASPからADOを使用して.csvに接続して、単純にデータを表示すると、<br>
データの型が自動変換されて、困ってしまうときがある<br>
※ファイル名はtest101.csvで、データは,カンマで区切られてます。<br>
<pre>
日付,IP,URL,分数TEST,少数TEST,備考,予備
2004/12/25,192.168.0.1,ken3.org,1/20,1.25,備考の文字,1-2-3
2005-01-08,192.168.0.25,/asp/,1/3,5.10,日付の形式を少し変えた
2005/01/19 17:30,192.168.0.17,vba,2/7,5,時刻を付けた,04-05-06
を読み込むと、勝手にフィールドの型が決まってしまい、処理に困る
そこで、1行のみのダミーファイルを用意して、
UNION ALL でつなげ、型を決めてみたいと思う
<b>ADOでCSVの接続</b>は、
<Font Color='Green'>'SQLのテーブル名には、ファイル名を指定します。</Font>
strSQL = "select * from test101.csv"
<Font Color='Green'>'接続情報の作成 ドライバーの指定と、DBQには、パスのみを指定する</Font>
Con = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
Server.MapPath(".") & ";"
'↑MapPathに(".")を渡し、カレントディレクトリを渡す
</pre>
こんな感じで普通に接続してみました。
<hr>
<%
Response.Write "<h2>普通にCSVファイルと接続</h2>"
'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん
Set rs=Server.CreateObject("ADODB.Recordset")
'接続情報の作成 ドライバーの指定と、DBQには、パスのみを指定する
Con = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
Server.MapPath(".") & ";Extensions=txt,csv,tab,;FIL=txt"
'↑MapPathに(".")を渡し、カレントディレクトリを渡す
'SQLのテーブル名には、ファイル名を指定します。
strSQL = "select * from test101.csv"
Response.Write "使用する接続文字列は<br>"
Response.Write "<STRONG><CODE>" & Con & "</CODE></STRONG><br>"
Response.Write "発行するSQL文字列は<br>"
Response.Write "<STRONG><CODE>" & strSQL & "</CODE></STRONG><hr>"
'接続文字列、SQLを渡して、レコードセットを開く
rs.Open strSQL, Con, 0 '0=adOpenForwardOnly
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しを(フィールド名を)そのまま書き込む
Response.Write "<TR>"
For Each fld_A In rs.Fields 'フィールドのアイテムに対してループ
Response.Write "<TH>" & fld_A.Name & "</TH>" '←.Nameでフィールド名
Next
Response.Write "</TR>"
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
Response.Write "<TR>" '内容を表示する
For Each fld_A In rs.Fields 'フィールドのアイテムに対してループ
'Response.Write "<TD>" & fld_A.Value & "</TD>" '←.Valueでフィールドの値
Response.Write "<TD>" & fld_A & "</TD>" '←.Valueでフィールドの値
Next
Response.Write "</TR>"
rs.MoveNext '次のレコードに移動する
Loop
Response.Write "</TABLE>" 'テーブルは終わりです
'後始末
rs.Close '開いていたレコードセットを閉じる
Set rs = Nothing 'お行儀よくオブジェクトも開放しましょう
Response.Write "<h2>ダミーファイルとUNION ALL で接続</h2>"
'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん
Set rs=Server.CreateObject("ADODB.Recordset")
'接続情報の作成 ドライバーの指定と、DBQには、パスのみを指定する
Con = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
Server.MapPath(".") & ";IMEX=1;"
'↑MapPathに(".")を渡し、カレントディレクトリを渡す
'SQLのテーブル名には、ファイル名を指定しで、UNION ALL でつなげる
strSQL = "select * from dummy101.csv "
strSQL = strSQL & " UNION ALL "
strSQL = strSQL & "select * from test101.csv"
Response.Write "使用する接続文字列は<br>"
Response.Write "<STRONG><CODE>" & Con & "</CODE></STRONG><br>"
Response.Write "発行するSQL文字列は<br>"
Response.Write "<STRONG><CODE>" & strSQL & "</CODE></STRONG><hr>"
'接続文字列、SQLを渡して、レコードセットを開く
rs.Open strSQL, Con, 0 '0=adOpenForwardOnly
'本番では、オープン後、1行空読みするといいのでは?
'rs.MoveNext 'ダミー分で次のレコードに移動する ここではコメント非実行
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しを(フィールド名を)そのまま書き込む
Response.Write "<TR>"
For Each fld_A In rs.Fields 'フィールドのアイテムに対してループ
Response.Write "<TH>" & fld_A.Name & "</TH>" '←.Nameでフィールド名
Next
Response.Write "</TR>"
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
Response.Write "<TR>" '内容を表示する
For Each fld_A In rs.Fields 'フィールドのアイテムに対してループ
Response.Write "<TD>" & fld_A.Value & "</TD>" '←.Valueでフィールドの値
Next
Response.Write "</TR>"
rs.MoveNext '次のレコードに移動する
Loop
Response.Write "</TABLE>" 'テーブルは終わりです
'後始末
rs.Close '開いていたレコードセットを閉じる
Set rs = Nothing 'お行儀よくオブジェクトも開放しましょう
%>
<hr>
[<a Href="test101.csv" TARGET="_blank">元ファイルtest101.csvを開く</a>]<br>
[<a Href="dummy101.csv" TARGET="_blank">ダミーファイルdummy101.csvを開く</a>]<br>
</body>
</html>
|
|