- 締切済み
ASP(VBScript)について教えてください。
以前、↓で質問を挙げさせてもらった者です。 <http://okwave.jp/qa/q6615640.html> ASPで作成した画面上からADOを用いて、CSVファイルの 項目を表示しようと思ったのですが、エラーが出てしまいました。 エラー箇所を調べてみたのですが、原因がわからず作業が中断しています。 申し訳ありませんが、下記のソースでどこが間違っているのか 教えていただけないでしょうか? ■期待する動作: CSVファイルを読み取り、指定したIDの行の名前(NAME),年齢(AGE)を 表示させる ******* CSVファイル(test.csv)の中身 ******* [ID],[NAME],[AGE] 1,山田,20 2,田中,30 3,佐藤,40 ******************************************* ******* ASP(VBScript)のソース ******* <% Dim objAdo Dim objRS Dim strPath Dim strId Dim strName Dim strAge strId = "2" 'test.csvのパスを取得 strPath = replace(Server.MapPath("test.csv"),"\test.csv","") 'ADOオブジェクトを作成 Set objAdo = CreateObject("ADODB.Connection") 'ADOを使いCSVファイルを扱う準備(オープン)を行う objAdo.Open "Driver={Microsoft Text Driver (*.txt ; *.csv)} ; DBQ=" & strPath & " ; ReadOnly=1" 'SQLを実行し、当該タスクのデータを抽出 Set objRS = objAdo.Execute("select * from test.csv where '[ID]' = '" & strId & "'") →ここからエラーになります。 strName = objRS("'[NAME]'").Value response.write("strName:" & strName & "<br>") strAge = objRS("'[AGE]'").Value response.write("strAge:" & strAge & "<br>") objRS.Close objAdo.Close %> select文内のwhere句で失敗しているように感じたので、 where '[ID]' = '" & strId の部分を下記の3パターンで 試してみたのですが、全てエラーが起きてしまいました。 where [[ID]] = '" & strId where {[}ID{]}' = '" & strId where [ID] = '" & strId CSVファイルのフォーマットは決まっている為、 現在のフォーマットで表示させたいのです。 お礼を言うのが少し遅くなってしまうかもしれませんが、 ご教示いただけると嬉しいです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tsuduki123
- ベストアンサー率32% (21/65)
案外、フィールド名を 「'」でくくっているのがおかしいかもしれません。 フィールド名やテーブル名は「"」でくくるんじゃありませんでした? 同じ問題で、objRS("'[NAME]'").Value も objRS("[NAME]").Value だったりしません? ASPのことはよくわからないので恐縮ですが とりあえず、発生しているエラーの詳細を確認してみてはどうでしょう? サンプルを見よう見まねで書くとこんな感じ? たとえば objAdo.Execute のあと、 if objAdo.Errors.Count > 0 then dim Errors as Object Set Errors = CreateObject("ADODB.Error") foreach Errors in objAdo.Errors response.write("Error:" & Errors.Description & "<br>") next end if ADODB.Error はこちらを参照してください。 http://msdn.microsoft.com/ja-jp/library/cc364259.aspx あと、コーディングで気になりましたが、もし、strId がハードコーディングとかでなければ SQLインジェクションに注意してください。 たぶん「?」やADODB.Parametersを利用してパラメータ付きクリエにするべきかと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
私はASP環境はありません。しかしWEBの記事などで下記を作って見ました。 下記で私の場合は動きましたので、対比して質問のものも残しているので考えてください。 データをエクセルシートにセットしましたが、お好みで。 フィールド名の関係でSQL文のWHERE以下を略してますが、本筋と関係ないでしょう。 私の場合は「C:\Documents and Settings\XXXX\My Documents\」にtest01.csv があります。 そういう環境で実行。 ーー Sub test01() Dim objAdo Dim objRS Dim strPath Dim strId Dim strName Dim strAge strId = "2" 'test.csvのパスを取得 'strPath = Replace(Server.MapPath("test.csv"), "\test.csv", "") strPath = "C:\Documents and Settings\XXXX\My Documents\" '\は必要 'ADOオブジェクトを作成 Set objAdo = CreateObject("ADODB.Connection") 'ADOを使いCSVファイルを扱う準備(オープン)を行う 'objAdo.Open "Driver={Microsoft Text Driver (*.txt ; *.csv)} ; DBQ=" & strPath & " ; ReadOnly=1" connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & strPath & ";" _ & "Extended Properties=""Text;HDR=NO;FMT=Delimited""" objAdo.Open connectionString 'SQLを実行し、当該タスクのデータを抽出 Set objRS = objAdo.Execute("select * from test01.csv") ' where '[ID]' = '" & strId & "'") rowNo = 1 'objRs.Openは要らないようだ '--以下はエクセルのシートにデータをセットした例 colNo = 1 Do While objRS.EOF = False 'データ抽出 For Each Item In objRS.fields MsgBox Item.Value '確認後はこの行抹消 Worksheets("Sheet1").Cells(rowNo, colNo).Value = Item.Value colNo = colNo + 1 Next colNo = 1 rowNo = rowNo + 1 '次のレコード objRS.MoveNext Loop objRS.Close objAdo.Close End Sub