24-8 PおwX

經由 WSH,我們也可以對資料庫進行新增、修改、刪除等動作,這些動作也都靠 SQL 指令來達成。舉例來說,若要對 test.mdb 進行列表,若用 ASP,可見下列範例:

Example(listdb01.asp):

上述範例的原始檔如下:

原始檔(listdb01.asp):(灰色區域按兩下即可拷貝)
<%@ language="jscript" %>
<% title="以 JScript 進行資料庫列表" %>
<!--#include file="head.inc"-->
<hr>

<%
//====== Step 1:建立資料庫連結,然後開啟資料庫
Conn = Server.CreateObject("ADODB.Connection");
Conn.ConnectionString = "DBQ=" + Server.MapPath("test.mdb") + ";Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;";
Conn.Open();

//====== Step 2:執行SQL指令,並將查詢結果儲存於 Recordset 中
SQL = "Select * from testTable";	//從資料表 testTable 取出所有資料
RS = Conn.Execute(SQL);
%>

<table border=1 align=center>
<tr bgcolor="cyan">
<%
//====== Step 3:透過 RecordSet 集合取得欄位的內容
//印出欄位名稱
for (i=0; i<RS.Fields.Count; i++)
	Response.write("<th>"+RS(i).Name+"</th>\n");
%>
</tr>
<%
//印出每一筆資料
while (!RS.EOF) {
	Response.write("<tr>\n");
	for (i=0; i<RS.Fields.Count; i++)
		Response.write("<td>"+RS(i)+"&nbsp;</td>\n");
	RS.MoveNext();
}
%>
</table>

<%
//====== Step 4:關閉 RecordSet 及資料庫連結
RS.Close();
Conn.Close();
%>

<hr>
<!--#include file="foot.inc"-->

若改用 WSH 來對資料庫列表,程式碼很接近,如下:

原始檔(dbList01.js):(灰色區域按兩下即可拷貝)
// 使用 WSH 列出資料庫的內容

//====== Step 1:建立資料庫連結,然後開啟資料庫
database="test.mdb";
conn = WScript.CreateObject("ADODB.Connection");
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+database; 
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+database;	// 64-bit Office
conn.Open();

//====== Step 2:執行SQL指令,並將查詢結果儲存於 recordset 中
recordSet = WScript.CreateObject("ADODB.RecordSet"); 
sql = "SELECT * FROM testTable"; //從資料表 test 取出所有資料
recordSet.Open(sql, conn, 3, 3); 

//====== Step 3:透過 recordSet 集合取得欄位的內容
//印出欄位名稱
WScript.Echo("欄位名稱:");
for (i=0; i<recordSet.Fields.Count; i++)
	WScript.StdOut.Write(recordSet(i).Name+"\t");
WScript.Echo("");

//印出每一筆資料
i=1;
WScript.Echo("每一筆資料:");
while (!recordSet.EOF){
	for (j=0; j<recordSet.Fields.Count; j++)
		WScript.StdOut.Write(recordSet(j)+"\t");
	WScript.StdOut.Write("\n");
	i++;
	recordSet.MoveNext();
}

//====== Step 4:關閉 recordSet 及資料庫連結
recordSet.Close();
conn.Close();

執行「cscript dbList01.js」後,在 DOS 命令視窗印出結果如下:

欄位名稱: ssn account name team score 每一筆資料: 14 abc 葉佳慧 5 33.33 15 ABC 林政源 5 55.65 17 jtchen 陳江村 3 48.76 18 aBc 高名揚 1 67.88 若要對資料庫進行新增,可見下列範例:

原始檔(dbInsert01.js):(灰色區域按兩下即可拷貝)
// 使用 WSH 新增資料庫的內容

//====== Step 1:建立資料庫連結,然後開啟資料庫
database="test.mdb";
Conn = WScript.CreateObject("ADODB.Connection");
Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+database; 
Conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+database;	// 64-bit Office
Conn.Open();

//====== Step 2:建立 SQL 命令並執行之
SQL="INSERT INTO testTable ([account], [name]) VALUES ('new1', 'new2')";
Conn.Execute(SQL);

//====== Step 3:關閉 RecordSet 及資料庫連結
Conn.Close();

如果你這時候再執行 dbList01.js,就會發覺資料已經多了一筆。

特別要注意的是,SQL 指令的 where 條件式是不分大小寫的,所以如果你的條件式是 name='abc',這時候抓出來的資料可能包含 'abc'、'ABC'、'aBc' 等資料,若要解決此問題,可以使用 strcomp 函數,請見下列範例:

原始檔(dbList02.js):(灰色區域按兩下即可拷貝)
// 大小寫有別的資料庫查詢
sql="select * from testTable where account='abc'";
WScript.Echo("大小寫不分的比對:sql = "+sql);
WScript.Echo("比對結果:");
sql2screen("test.mdb", sql); 
sql="select * from testTable where strcomp(account, 'abc',0)=0";
WScript.Echo("大小寫有別的比對:sql = "+sql);
WScript.Echo("比對結果:");
sql2screen("test.mdb", sql); 

// ====== Function definitions
function sql2screen(database, sql){
	conn = WScript.CreateObject("ADODB.Connection"); 
//	conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+database;
	conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+database;	// 64-bit office
	conn.Open();
	rs = WScript.CreateObject("ADODB.RecordSet"); 
	rs.Open(sql, conn, 3, 3);

	// 印出欄位名稱
	for (i=0; i<rs.Fields.Count; i++)
		WScript.StdOut.Write(rs(i).Name+"\t");
	WScript.StdOut.Write("\n");
	// 印出每筆資料
	while (!rs.EOF){
		for (j=0; j<rs.Fields.Count; j++)
			WScript.StdOut.Write(rs(j)+"\t");
		WScript.StdOut.Write("\n");
		rs.MoveNext();
	}
	rs.Close();
	conn.Close();
}

印出結果如下:

大小寫不分的比對:sql = select * from testTable where account='abc' 比對結果: ssn account name team score 14 abc 葉佳慧 5 33.33 15 ABC 林政源 5 55.65 18 aBc 高名揚 1 67.88 大小寫有別的比對:sql = select * from testTable where strcomp(account, 'abc',0)=0 比對結果: ssn account name team score 14 abc 葉佳慧 5 33.33 在上述原始碼中,sql2screen() 函數的功能是將 SQL 指令的結果列印在螢幕上。另一個常用的函數是將 SQL 指令的結果記錄在檔案之中,在以下範例中,sql2file() 函數的功能即是如此:

原始檔(dbList03.js):(灰色區域按兩下即可拷貝)
// 將 testTable 資料表的內容儲存到 output.txt
WScript.Echo("將 testTable 資料表的內容儲存到 output.txt ...");
sql2file("test.mdb", "select * from testTable", "output.txt");

// ====== Function definitions
function sql2file(database, sql, file){
	conn = WScript.CreateObject("ADODB.Connection"); 
//	conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+database;
	conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+database;	// 64-bit office
	conn.Open();
	rs = WScript.CreateObject("ADODB.RecordSet"); 
	rs.Open(sql, conn, 3, 3);

	fso = WScript.CreateObject("Scripting.FileSystemObject")
	fid = fso.CreateTextFile(file, true);

	// 印出欄位名稱
	for (i=0; i<rs.Fields.Count; i++)
		fid.Write(rs(i).Name+"\t");
	fid.Write("\r\n");
	// 印出每筆資料
	while (!rs.EOF){
		for (j=0; j<rs.Fields.Count; j++)
			fid.Write(rs(j)+"\t");
		fid.Write("\r\n");
		rs.MoveNext();
	}
	fid.Close();
	rs.Close();
	conn.Close();
}

執行以上程式後,檔案 output.txt 的內容如下:

原始檔(output.txt):(灰色區域按兩下即可拷貝)
ssn	account	name	team	score	
14	abc	葉佳慧	5	33.33	
15	ABC	林政源	5	55.65	
17	jtchen	陳江村	3	48.76	
18	aBc	高名揚	1	67.88	


JScript 程式設計與應用:用於單機的 WSH 環境