プロが教える店舗&オフィスのセキュリティ対策術

以前、↓で質問を挙げさせてもらった者です。
<http://oshiete.goo.ne.jp/qa/6615640.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ファイルのフォーマットは決まっている為、
現在のフォーマットで表示させたいのです。

お礼を言うのが少し遅くなってしまうかもしれませんが、
ご教示いただけると嬉しいです。

A 回答 (2件)

私は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
    • good
    • 0

案外、フィールド名を 「'」でくくっているのがおかしいかもしれません。


フィールド名やテーブル名は「"」でくくるんじゃありませんでした?

同じ問題で、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 …

あと、コーディングで気になりましたが、もし、strId がハードコーディングとかでなければ
SQLインジェクションに注意してください。
たぶん「?」やADODB.Parametersを利用してパラメータ付きクリエにするべきかと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!