[三流君] −−>
[ASPで遊ぶ、失敗する] −−>
[バックナンバー一覧]
−−> No.091 ADO CSVでReadOnly=0と.AddNewを使いデータ追加
ADO CSVでReadOnly=0と.AddNewを使いデータ追加
本文(発行内容)
<ADO CSVでReadOnly=0と.AddNewを使いデータ追加>
こんにちは、三流プログラマーのKen3です。
今回は、
ADOのCSV接続で、
ReadOnly=0と.AddNewを使いデータを追加してみた
そんなお話です。
http://www.ken3.org/cgi-bin/group/asp_ado_csv.asp
に、
関連項目ASPでADO CSV接続の他のサンプルもあるので、合わせて見てください。
/*
* 1.今回のキッカケ
*/
特に無いんだけど、
CSVの更新と削除は、
Microsoft OLE DB Provider for ODBC Drivers エラー '80004005'
[Microsoft][ODBC Text Driver] この ISAM では、
リンク テーブル内のデータを削除することはできません。
と、怒られてました。
では、追加(ファイルの後ろにAppendの追記)はできるかなぁ〜
と
あまり使わないかも的な処理を書いてみました。
※普通に追加なら、FileSystemObjectで追加していけば通常はOKなのですが、
強引にネタとしてしまいました。
/*
* 2.開き方のポイント ReadOnly=0なんてパラメータあったよ
*/
さてと、データを追加するのかぁ。
追加だから、
'接続文字列、SQLを渡して、レコードセットを開く
rs.Open strSQL, Con, adOpenStatic, adLockOptimistic
で、開こうとすると
ADODB.Recordset エラー '800a0bb9'
引数が間違った型、または許容範囲外であるか、競合しています。
/cgi-bin/test/test091-1.asp, 行 44
あららダメかぁ・・・
Const adOpenStatic = 3 '---- CursorTypeEnum Values ----
で、開けないんですね・・・
そんなこんなで、失敗が続き、調べてみると、
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B316475
↑xlsの例みたいですが、
cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
とあって、
おっ?
ReadOnly=0なんてパラメータあったよ
^^^^^^^^^^
こんどは、ReadOnly=0で調べると、
ReadOnly=0 (更新可能)
ReadOnly=1 (更新不可、リードオンリー)
となっている。(ReadOnly=True/Falseとは書けないのかなぁ?)
接続文字列を下記のように作成しました。
'※接続情報の作成 ドライバーの指定と、DBQには、パスのみを指定する
Con = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" _
& Server.MapPath(".") & ";" _
& "ReadOnly=0;"
で、開く時は、レコードセットを作成して、
'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん
Set rs=Server.CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseServer 'カーソルはサーバーの指定
'SQLのテーブル名には、ファイル名を指定します(test091.csvを指定)
strSQL = "select * from test091.csv"
'接続文字列、SQLを渡して、レコードセットを開く
rs.Open strSQL, Con, adOpenDynamic, adLockOptimistic
と、SQLを渡して作成してみました。
※rs.CursorLocation = adUseServer 'カーソルはサーバーの指定
は、無くてもOKでした(あとで気が付きました)
/*
* 3..AddNewでデータを追加してみた
*/
接続が出来たら(レコードセットが作成できたら)
今度はレコードを追加してみたかったので、
.AddNewでデータを追加してみます。
ファイル名はtest091.csvで、データは,カンマで区切られてます。
FID,書き込み時刻,IP情報,Reffer
の4つの項目をCSVで管理してみます。
このASP(test091-1.asp)が実行されたら、
test091.csvと接続後、
最終行にカーソルを移動(.Movelast)してFID+1の次の番号を計算。
.Addnew後、
IPアドレスの頭10桁とReferrer(どこからきたか)をフィールドにセットして、
.Updateで更新してみます。
実際のテストは、
http://www.ken3.org/cgi-bin/test/test091-1.asp
で、実行できます。(ソースの全ても見れます。)
まずは、
接続・レコードセットの作成です
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'※接続情報の作成 ドライバーの指定と、DBQには、パスのみを指定する
Con = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" _
& Server.MapPath(".") & ";" _
& "ReadOnly=0;"
'SQLのテーブル名には、ファイル名を指定します(test091.csvを指定)
strSQL = "select * from test091.csv"
'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん
Set rs=Server.CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseServer 'カーソルはサーバーの指定
'接続文字列、SQLを渡して、レコードセットを開く
rs.Open strSQL, Con, adOpenDynamic, adLockOptimistic
ここまでで、なんとかCSVと接続しました。
ポイントは、接続文字列のReadOnly=0です。
最後の番号を取得したいので、
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'最終のデータを取得する
rs.MoveLast 'レコードを最終行へ移動
NEXT_NO = Cint(rs.Fields("FID").Value) + 1 '次の番号を+1して計算する
.MoveLastで最終行に移動後、.Fields("FID").Valueの値に+1して、
次の連番を作成しました。
データを.AddNewで追加する
^^^^^^^^^^^^^^^^
rs.AddNew
rs.Fields("書き込み時刻").Value = Now()
rs.Fields("FID").Value = NEXT_NO '次の番号をセットする
'↓番号でフィールドにアクセスも出来るよ
rs.Fields(2).Value = Left(Request.ServerVariables("REMOTE_ADDR"), 10)
rs.Fields(3).Value = Request.ServerVariables("HTTP_REFERER")
Response.Write ".Updateで更新(レコード確定)<br>"
rs.Update
rs.Close 'クローズして確定する
ここも、ポイントは特に無いのですが、
rs.Fields("書き込み時刻")やrs.Fields("FID")
と、フィールド名で指定する方法と
rs.Fields(2)やrs.Fields(3)のように、フィールドの番号で指定する方法、
どちらも使えます。
データをセットしたら、
.Update で データを確定してます
(忘れても、.Closeやカーソル移動で自動確定されるけど)
http://www.ken3.org/cgi-bin/test/test091-1.asp
で、テスト可能なので、遊んでみてください(ソースの全ても見れます。)
/*
* 4.終わりの挨拶 </HTML>
*/
今回は、
ADOを使用して、CSVと接続、データを追加してみました。
※ADOで接続が面倒、これなら、FileSystemObjectで追加したほうが楽。
と、判断材料に使ってもらえればうれしいです。
いろいろと問題点や疑問点を残しつつ、脱線・寄り道の多いメルマガですが、
今後とも、よろしくお願いします。
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告