まず正しいプログラムから作られたSQL文と、間違ったプログラムから作られたSQL文を比較してください。
・正しい
var mySql = "insert into T01Prefecture values(" + Number(txtPrefCd.value) + ",'" + txtPrefName.value + "')";
insert into T01Prefecture values(100,'テスト2')
・間違い
var mySql = "insert into T01Prefecture values(Number(txtPrefCd.value),'txtPrefName.value')";
insert into T01Prefecture values(Number(txtPrefCd.value),'txtPrefName.value')
違いがわかりますか?
SQL文をデータベース上で直接実行する場合はSQL文そのものを考えればよいのですが、プログラムの中でSQL文を書く場合は、「プログラムが組み立てたあとのSQL文」を考えなくてはなりません。
なぜならユーザーが画面から入力した値をSQL文の中に埋め込む必要があるからです。そしてこの埋め込む書き方こそが初心者には理解しにくい部分なのです。そこで考え方を順を追って説明します。
【1】まずSQL文を作る理由はデータベースを操作したいからです。そこでデータベースでそのまま実行できるSQL文を考えます。文字列は「'」(シングルクォーテーション)で囲む決まりがあります。
insert into T01Prefecture values(100,'テスト2')
*話を簡単にするためフィールド名は省略しています。
【2】次に上記のSQL文をまるごと変数に代入する方法を考えます。SQL文自体は文字列なので変数に代入する時は「"」(ダブルクォーテーション)で囲みます。
var mySql ="insert into T01Prefecture values(100,'テスト2')"
【3】しかしデータベースに追加する値はいつも決まっているわけではありません。ユーザーが画面から入力した値が使えるように考えてみましょう。
var mySql = "insert into T01Prefecture values(Number(txtPrefCd.value),'txtPrefName.value')";
一見上記のように書けそうですが、このプログラムから作られるSQL文は以下のように間違った形になります。
insert into T01Prefecture values(Number(txtPrefCd.value),'txtPrefName.value')
つまりコントロールの値に変わるべきNumber(txtPrefCd.value)や'txtPrefName.value'が、そのまま文字として扱われてしまっているのです。
【4】コントロールや変数をちゃんと値として置き換えるには、「"」(ダブルクォーテーション)の外に出してあげる必要があります。そして前後の文字列とは「+」でつなげます。
var mySql = "insert into T01Prefecture values(" + Number(txtPrefCd.value) + ",'" + txtPrefName.value + "')";
そうするとプログラムから作られるSQL文は以下のように正しい形になります。
insert into T01Prefecture values(100,'テスト2')
Number(txtPrefCd.value)や'txtPrefName.value'がちゃんと値に置き換わっていますね。
【5】それでもまだ難しい人は、以下の順番で変化を考えるとわかりやすいと思います。これが最も重要なコツです。
最初の形
"insert into T01Prefecture values(Number(txtPrefCd.value),'txtPrefName.value')"
コントロールや変数の前後に半角空白を入れ切り離す。
"insert into T01Prefecture values( Number(txtPrefCd.value) ,' txtPrefName.value ')"
コントロールや変数以外の文字列部分を「"」(ダブルクォーテーション)で囲む
"insert into T01Prefecture values(" Number(txtPrefCd.value) ",'" txtPrefName.value "')"
コントロールや変数と文字列を「+」で結合して完成
"insert into T01Prefecture values(" + Number(txtPrefCd.value) + ",'" + txtPrefName.value + "')"
このSQL文の変化が一番説明が難しいところです。このコツをつかんでいただけたら業務システムは作れるようになります。
データベースのテーブルが複雑になり、フィールド数、コントロール、変数が増えるとSQL文は「"」(ダブルクォーテーション)の中に入ったり出たりを繰り返しますが、基本は今回学んだ考え方でできます。
最後にプログラムを元に戻しましょう。正しいSQL文の出力部分はシステムが完成するまで残しておいたほうがよいでしょう。更新や削除でもSQL文を確認できたほうが便利です。また作ったSQL文がどうしても動かない時は、表示されたSQL文をコピーしてデータベース上で直接実行実行してみると間違いの原因がわかることがあります。(SQL文が複雑になるほど重宝します)
【6】「sample010.js」を以下のように更新してください。コピーして貼り付けてもかまいません。
var database;
onload = init;
onunload = dbClose;
function init() {
document.getElementById("txtPrefCd").onblur = function (){blur(this);}
document.getElementById("txtPrefCd").onfocus = function (){focus(this);}
document.getElementById("txtPrefName").onblur = function (){blur(this);}
document.getElementById("txtPrefName").onfocus = function (){focus(this);}
document.getElementById("btnInsert").onclick = function (){insert();}
dbConnect();
dataDisp();
}
//データベースに接続
function dbConnect() {
database = new ActiveXObject("ADODB.Connection");
database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\\SampleDB010.mdb;");
alert("データベースに接続しました。");
}
//データベースを切断
function dbClose() {
database.Close();
database = null;
alert("データベースを切断しました。");
}
function focus(obj){
obj.style.backgroundColor = "#ffff00";
}
function blur(obj){
obj.style.backgroundColor = "#ffffff";
}
//データ表示
function dataDisp() {
var mySql = "select * from T01Prefecture order by PREF_CD";
var recordSet = database.Execute(mySql);
var tempHtml="";
document.getElementById("disp").innerHTML = "";
while (!recordSet.EOF){
tempHtml = tempHtml + recordSet(0) + ":" + recordSet(1) + "<br />";
recordSet.MoveNext();
}
document.getElementById("disp").innerHTML = tempHtml;
recordSet.Close();
recordSet = null;
}
//データ追加
function insert() {
with (document.form1) {
var mySql = "insert into T01Prefecture values(" + Number(txtPrefCd.value) + ",'" + txtPrefName.value + "')";
}
document.getElementById("sql").innerHTML = "<p>" + mySql + "</p>";
database.Execute(mySql);
dataDisp();
alert("追加しました。");
}
insert()を少し修正しました。
document.getElementById("sql").innerHTML = "<p>" + mySql + "</p>";
database.Execute(mySql);
変数mySqlに改行を加えると次のExecute(mySql)で引数に使えなくなります。そこでmySqlの値自体は変化させないで、前後にhtmlのpタグ(段落)を加えてからinnerHTMLに代入することにしました。いろいろ方法があるということです。
またSQL文をWebブラウザに表示するのは、必ずExecute(mySql)の前に行う必要があります。順序を逆にすると、SQL文が間違っていた場合プログラムが止まるので、SQL文を表示できないからです。
SQL文を表示した後ならたとえプログラムが止まっても原因を見つけやすくなります。