1.4 データベースにアンケート回答データを格納する

■テーブルにデータを追加する

リスト1.6 add.asp

<% Option Explicit %>
<HTML>
<HEAD>
<TITLE>add.asp</TITLE>
</HEAD>
<BODY>
<%
Const FOR_DEBUG = "<BR>Debug(add.asp): "
Const DATASOURCE = "aspZADO"

Dim intQ1,intQ21,intQ22,intQ23,intQ24,strQ24,strQ3
Dim objConn,objRst

intQ1 = Request("Q1")
intQ21 = Request("Q21")
intQ22 = Request("Q22")
intQ23 = Request("Q23")
intQ24 = Request("Q24")
strQ24 = Request("Q24txt")
strQ3 = Request("Q3")

Response.Write FOR_DEBUG & "intQ1=" & intQ1 & "<BR>"
Response.Write FOR_DEBUG & "intQ21=" & intQ21 & "<BR>"
Response.Write FOR_DEBUG & "intQ22=" & intQ22 & "<BR>"
Response.Write FOR_DEBUG & "intQ23=" & intQ23 & "<BR>"
Response.Write FOR_DEBUG & "intQ24=" & intQ24 & "<BR>"
Response.Write FOR_DEBUG & "strQ24=" & strQ24 & "<BR>"
Response.Write FOR_DEBUG & "strQ3=" & strQ3 & "<BR>"

'データベースにデータを格納する
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open DATASOURCE

Set objRst = Server.CreateObject("ADODB.Recordset")
objRst.Open "tblQuestion", objConn, 3,2
objRst.AddNew
objRst.Fields("Q1") =intQ1
objRst.Fields("Q21") =intQ21
objRst.Fields("Q22") =intQ22
objRst.Fields("Q23") =intQ23
objRst.Fields("Q24") =intQ24
objRst.Fields("Q24txt") =strQ24
objRst.Fields("Q3") =strQ3
objRst.UpDate
<%= "データを1件追加しました<BR>" %>
objRst.Close
objConn.Close
%>
</BODY>
</HTML>

 リスト1.6を実行する前に、リスト1.2の09行目を

09 <FORM ACTION="receive.asp" METHOD="post">

から

09 <FORM ACTION="add.asp" METHOD="post">

に変更しておきます。

図1.6

■テーブル内容の確認

 データベースdbTest内のテーブルtblQuestionの内容を確認してみます。

Access2000を起動し、データベースdbTestを開き、テーブルtblQuestionを開きます。今、追加したオンライン・アンケートの回答データが新しいレコードとして追加されています。

図1.7

objRst.Fields()の省略形

 objRst.Fields()objRst()と".Fields"の部分を省略して記述することができます。

リスト1.6の該当部分は、次のように簡単化できます。

リスト1.7 add2.asp(一部)

objRst.AddNew
objRst("Q1") =intQ1
objRst("Q21") =intQ21
objRst("Q22") =intQ22
objRst("Q23") =intQ23
objRst("Q24") =intQ24
objRst("Q24txt") =strQ24
objRst("Q3") =strQ3
objRst.UpDate

■最も簡潔なプログラミング

 アンケート・ページから受信したデータをいちいち変数に格納せずに、直接データベースに格納することができます。

objRst("フィールド名") = Request("フォームの名称")

というように記述します。この記述法によれば、リスト1.6はリスト1.8のようになります。

リスト1.8

<%@ LANGUAGE="VBScript" %>
<% Option Explicit %>
<HTML>
<HEAD>
<TITLE>add3.asp</TITLE>
</HEAD>
<BODY>
<%
Const FOR_DEBUG = "<BR>Debug(add3.asp): "
Const DATASOURCE = "aspZADO"

Dim objConn,objRst

Response.Write FOR_DEBUG & "intQ1=" & Request("Q1") & "<BR>"
Response.Write FOR_DEBUG & "intQ21=" & Request("Q21") & "<BR>"
Response.Write FOR_DEBUG & "intQ22=" & Request("Q22") & "<BR>"
Response.Write FOR_DEBUG & "intQ23=" & Request("Q23") & "<BR>"
Response.Write FOR_DEBUG & "intQ24=" & Request("Q24") & "<BR>"
Response.Write FOR_DEBUG & "strQ24=" & Request("Q24txt") & "<BR>"
Response.Write FOR_DEBUG & "strQ3=" & Request("Q3") & "<BR>"

'データベースにデータを格納する
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open DATASOURCE

Set objRst = Server.CreateObject("ADODB.Recordset")
objRst.Open "tblQuestion", objConn, 3,2
objRst.AddNew
objRst("Q1") =Request("Q1")
objRst("Q21") =Request("Q21")
objRst("Q21") =Request("Q22")
objRst("Q21") =Request("Q23")
objRst("Q21") =Request("Q24")
objRst("Q24txt") =Request("Q24txt")
objRst("Q3") =Request("Q3")
objRst.UpDate
%>
データを1件追加しました<BR>
<%
objRst.Close
objConn.Close
%>
</BODY>
</HTML>

■長さ0の文字列はテキストフィールドには格納できない

 たとえば、図1.8のアンケート回答を送信してみます。

図1.8

すると、図1.9のように、"フィールド 'tblQuestion.Q24txt' には、長さ 0 の文字列を格納できません。" というエラーメッセージが表示されます。

図1.9

 エラーが発生したのは、45行目で、実際はその前の43行目の

objRst("Q24txt") =strQ24

で、strQ24が長さ0の文字列でないかどうかあらかじめチェックする必要があります。そこで、

If  Len(strQ24) > 0 Then objRst("Q24txt") = strQ24

とします。同様に、次の44行目も

If  Len(strQ3) > 0 Then objRst("Q3") = strQ3

とします。このように修正したファイルをadd4.aspとします。

 再度、図1.8のようにアンケート回答を送信すると、今度は正常にテーブルにデータが格納されます。

図1.10

 テーブルtblQuestionの内容を表示すると、今送信したデータが図1.11のように正常に格納されていることがわかります。

図1.11


目次