การเขียนโปรแกรมภาษาเอเอสพี ASP
ความรู้เบื้องต้นเกี่ยวกับ ASP
สารบัญ
dthai97.mdb
dthai97.xls
dthai2007.xlsx
dthai100k.mdb
northwind.mdb#


โฮมเพจภาษาที่เกี่ยวข้อง
ASP.NET
VB.NET
VB
MS Access
AJAX
เอเอสพีคืออะไร (What is ASP?) [wikipedia.org]
เอเอสพี (ASP = Active Server page) และ เอเอสพีดอทเน็ต (ASP.NET = Active Server page .NET) คือ ภาษาโปรแกรมที่ทำงานบนเครื่องบริการเว็บไอไอเอส (IIS = Internet Infomation Service) เป็นภาษาสคริปต์ทำงานฝั่งเครื่องบริการ (Server-Side Script) พัฒนาโดยบริษัทไมโครซอฟท์ โดยมีรากฐานภาษามาจากภาษาเบสิก สำหรับเอเอสพีดอทเน็ตจะต้องทำงานบนดอทเน็ตเฟรมเวิร์ค (Dotnet Framework)
บริษัทไมโครซอฟท์ได้เริ่มพัฒนาเอเอสพีในช่วงเดือนธันวาคม พ.ศ. 2540 (ค.ศ.1997) มากับไอไอเอส 3.0 (IIS = Internet Information Server) สำหรับเอเอสพีรุ่น 1 ถูกมองว่าทำงานได้ล่าช้ากว่าโปรแกรมประเภทเดียวกัน อีก 1 ปีต่อมา บริษัทไมโครซอฟท์ได้เปิดตัวเอเอสพีรุ่น 2 ให้เป็นส่วนหนึ่งของ Option Pack ใน Windows NT4 และ 2 ปีต่อมาไอไอเอสรุ่น 3 ได้เปิดตัวเป็นส่วนหนึ่งของระบบปฏิบัติการวินโดว์ 2000
การใช้ Access ใน godaddy.com
เข้าไปที่ Manage Account ของ Control Panel ใน Hosting Account ถ้าใช้บริการของ Godaddy.com แล้วเลือก Database, Access และ Enable Access Support ระบบจะสร้างห้อง access_db ให้นำแฟ้ม .mdb ไปใส่ในห้องนั้น ระบบนี้รองรับการสร้าง DSN ผ่าน Control Panel ได้


รุ่นของเอเอสพี (ASP Version)
- ASP รุ่น 1 (ธ.ค.1997) พร้อมเว็บเซิร์ฟเวอร์ไอไอเอส 3.0 (IIS 3.0)
- ASP รุ่น 2 (ก.ย.1998) พร้อมเว็บเซิร์ฟเวอร์ไอไอเอส 4.0 บนWinNT
- ASP รุ่น 3 (พ.ย.2000) พร้อมเว็บเซิร์ฟเวอร์ไอไอเอส 5.0 บนWin2000
- ASP+ (ปลายปี 2000) เป็นรุ่นทดลองใช้ชื่อว่า ASP+ แล้วเปลี่ยนเป็น ASP.NET
- ASP.NET รุ่น 1 (ก.พ.2002) เปิดตัวพร้อม .NET Framework
- ASP.NET รุ่น 2 เปิดตัว 7 พ.ย.2005
การแก้ปัญหาภาษาไทยของ .mdb + asp

คุณ Rattakorn Jitsripitaklert ส่งแฟ้ม .mdb ซึ่งมีข้อมูลเป็น unicode ดังภาพ ถ้าอ่านข้อมูลด้วย asp ธรรมดา จะแสดงเป็น ?? ซึ่งเป็นปัญหาคล้ายการใช้ php กับ mysql สำหรับการแก้ปัญหาเมื่อใช้แฟ้ม .asp อ่านข้อมูลมาแสดงอย่างถูกต้อง ทำโดยเพิ่มบรรทัดนี้เป็นบรรทัดแรก
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
เคยสร้างตารางด้วย Access 2003 แล้วได้ .mdb ที่มี format 2000 พอใช้ใน 7host.com พบแต่ ??? เมื่อ Convert ไปเป็น 97 format แล้ว upload เข้า 7host.com ก็ไม่พบปัญหาในการแสดงผลแต่อย่างใด

แนะนำ free webhosting

ที่ปิดบริการไปแล้ว : thai.net ewebcity.com frontuk.com webhostme.com 1asphost.com domaindlx.com 00000web.com
แนะนำเว็บไซต์ (Website Guides) และระบบที่น่าสนใจ
- Thaiwbi.com - Passkorn Roungrong (ละเอียด)
- ASP e-Commerce (รวม link)
- W3schools.com (Thumbs UP)
- tosdn.com (รวม Script)
- Refdev.com
- Aspfree.com
- Codango.com
- Haneng.com/Lessons_17.asp
- task_password.html
- CodeBank ***
- หัวข้อใน CD 6 แผ่น
รหัสต้นฉบับ (Source Code)
1. กระดานข่าว (Webboard)
- สมาชิกได้สิทธิการเป็นสมาชิกทันที
- ลบสมาชิก แล้วจะลบกระทู้ทั้งหมดของสมาชิก
- admin ลบสมาชิก กระทู้ส่วนตอบ และคำถาม
- สืบค้นกระทู้ จากหัวข้อ และรายละเอียดได้
- แสดงจำนวนผู้อ่าน และเขียน แต่ละกระทู้
- เคยทดสอบที่ 7host.com(hacked) + boardx.mdb
2. select4.asp # :: โปรแกรมช่วยนำเสนอข้อมูลจากตารางใน .mdb หรือ .xls
ตัวอย่าง : อ่านข้อมูลผู้มีสิทธิ์สอบ อบต. ลำปาง แบบสืบค้นตามชื่อ หรือเรียงตามนามสกุล (โปรแกรมช่วยเลือกข้อมูลจากตารางใน .mdb ผ่าน URL)
3. ระบบข่าว :: เพิ่ม-ลบ โดยระบบสมาชิก
- โปรแกรมสำหรับบริการ ระบบข่าว (News System) อย่างง่าย
- ปรับให้ใช้กับ Intranet ของจังหวัดลำปาง และบริษัทเอกชนแห่งหนึ่ง
- ชื่อแฟ้ม : dbinfo.mdb, dbnews.mdb, default.asp, ynaddnews.asp
- แสดงวันที่ response.write (Formatdatetime(now(),1))
4. upload.asp :: สำหรับส่งแฟ้มเข้า server
- นำจาก freeaspupload.net มาแก้ไข
- ใช้แฟ้มเดียว หรือส่ง file จากแฟ้มอื่น ก็รับ
การเขียนภาษา ASP : แบบเรียงตามบทเรียน
บทเรียนนี้ใช้วิธีแสดงตัวอย่าง Source code ให้ศึกษา และ ท่านสามารถ ทดลองประมวลผล ได้ทันที
การทำให้ Windows เป็น Web server และบริการ ASP
  1. เรียน programming ด้วย Pyramid เบื้องต้น (รับ request.querystring)
  2. เรียน programming ด้วย Pyramid ชั้นกลาง (รับ request.querystring ผ่าน method get)
  3. ฟังก์ชันพื้นฐานของ ASP (แสดง syntax ของ function 23 ตัว)
  4. ส่งค่า Option ไปเลือก Table (เป็นชุดคำสั่งง่าย ๆ เพื่อเลือกเรียกตารางมาแสดง)
  5. การสั่งทำซ้ำด้วย for, while (โปรแกรมแรกของท่าน) (พื้นฐานละเอียด)
  6. การเรียกใช้ค่า env และ function (ให้รู้จักตัวแปรเบื้องต้น)
  7. การเขียน ASP ร่วมกับ HTML (แสดงความต่างและเหมือน)
  8. การเขียนตาราง ASCII (ใช้ฟังก์ชัน ASC, CHR)
  9. การอ่าน Access มาพิมพ์ (เริ่มต้นเรียนรู้ MDB)
  10. การเพิ่มข้อมูลAccessแบบADO+SQL (รับค่าจาก form)
  11. การทำระบบสมาชิกใน Access (เพิ่ม ลบ แก้ไขได้)
  12. การทำระบบสมาชิก(Confirm) (ถามย้ำก่อน ประมวลผล)
  13. การเขียน Search Engine อย่างง่าย (มี mdb ให้ download ฟรี)
  14. การสุ่มหลายค่า(ซ้ำและไม่ซ้ำ) (ใช้ randomize)
  15. การส่ง Mail ด้วย ASP (ใช้ smtp เป็นหลัก)
  16. การทำ Counter จาก Text File (สร้าง ปรับปรุง และพิมพ์ จาก text file)
  17. บริหารกระดานข่าวสมัครงาน (อย่างง่าย ๆ ไม่สวยงาม และยังไม่ได้ปรับรายงาน)
  18. ศูนย์สอบ online หลายชุด (รับคำสั่งทั้งจาก url และ form ได้)
  19. การเขียนโปรแกรมรายงานผลการเรียน (ทำเป็นบริการจริง ๆ ให้ครู และนักเรียนเข้าใช้บริการ)
    หรือ จะเรียกผ่านบริการ redirection ได้เป็น http://go.to/grade ลองไปใช้บริการดูนะครับ ไม่ใช่ครู ก็ทดสอบได้
    คำถามที่ถูกถามบ่อย (FAQs = Frequently Asked Questions)
        ถ้ามีปัญหา ก่อนจะถามผม ช่วยลองเขียนโปรแกรมง่าย ๆ ดูก่อน ท่านอาจเจอปัญหา และวิธีแก้ปัญหาด้วยตนเอง เช่น อ่านข้อมูลจาก mdb มาแสดง แต่ถ้าไม่ได้ให้ copy mdb ที่ผมเปิดให้ copy พร้อม source ไปลองดู กับ server ฟรีนั้นก่อนนะครับ .. หลายปัญหาเป็นเส้นผมบังภูเขา ขยับนิดนึ่งก็เรียบร้อย
  1. ทำไมฟ้อง database may be corrupt :
    เพราะ compiler ของฝรั่งเป็นฝรั่ง แต่ของไทยเป็นไทย เมื่อสร้าง mdb แล้วปรับปรุงแก้ไขอะไรมาก ๆ ทำให้โครงสร้างภายในเปลี่ยน เช่น การ compact database อาจทำให้ใช้งานในเว็บฝรั่งไม่ได้ วิธีแก้ให้เริ่มจาก copy mdb ของผมไปทดลองดู โดยเปลี่ยนโครงสร้าง ถ้าใช้ได้แล้วค่อยทดลองสร้างของตนเอง แต่อย่าพยายามปรับโครงสร้าง ไม่งั้นก็ไม่ work ตัวอย่างแฟ้ม mdb ที่ให้ลอง Download ไปใช้คือ search.mdb(276KB) ใช้ในบทเรียนเรื่อง การเขียน Search Engine อย่างง่าย หรือแฟ้ม quiz.mdb(84KB) ใช้ในบทเรียนเรื่อง ศูนย์สอบ Online หลายชุด
  2. ทำไมติดต่อ database ไม่ได้ บอกว่า sql error :
    เพราะ แต่ละ server กำหนดให้เราติดต่อกับ mdb แตกต่างกัน บางครั้งใช้แบบนั้นติดต่อได้ พอเปลี่ยนเครื่องทดสอบก็มีปัญหา วิธีแก้ให้เปิดเว็บของเขาว่า ให้เขียนโปรแกรมติดต่อกับ server ของเขาอย่างไร เมื่อ มกราคม 49 ผมก็ทดสอบกับ 1asphost.com ก็ไม่ได้ จึงต้องหันไปทดสอบกับ 7host.com ปรากฎว่าไม่พบปัญหาครับ
  3. สามารถ Download Jet40Repl.exe สำหรับ update Microsoft Jet Database รุ่น 4.0 เพราะมีข่าวว่ามีปัญหาเรื่องจุดบกพร่อง แต่ถ้าต้องการทราบว่า เครื่องของเรามี Microsoft Jet Database รุ่นใด สามารถตรวจสอบด้วยการเปิด regedit แล้วหาคำว่า "Microsoft Jet" และกด F3 เพื่อ Find next ก็จะแสดงเลขรุ่นมาให้เห็น
global.asa

ถ้าเก็บแฟ้ม global.asa ในห้องที่เก็บแฟ้ม .asp ผล คือ เมื่อเปิดแฟ้มที่สกุล .asp ใดก็ตาม IIS จะช่วย แทรกภาพมุมบนซ้าย ในเว็บเพจนั้น สามารถนำไปใช้เพิ่ม counter ให้ทุกหน้าโดยอัตโนมัติ <script language=vbscript runat=server> sub Session_OnStart response.write "<div style='position:absolute; left:0px; top:0px;z-index:0;'>" response.write "<img src=http://www.thaiall.com/me/picme.jpg></div>" Session.Abandon end sub </script>
ความหมายของฐานข้อมูล
ระบบฐานข้อมูล (Database System) # คือ การรวมข้อมูลที่เกี่ยวข้องสัมพันธ์กันเข้าด้วยกัน (Integrate) มีการจัดกลุ่มข้อมูลเก็บอยู่ในรูปตาราง (Grouping) เชื่อมโยงตารางทั้งหมดเข้าด้วยกัน (Share) เพื่อลดความซ้ำซ้อนในการจัดเก็บข้อมูล (Non Redundancy)
ระบบ (System) ประกอบด้วย 1)วัตถุประสงค์ (Objective) 2)ปัจจัยนำเข้า (Input) 3)กระบวนการ (Process) และ 4)ผลผลิต (Output)
ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) [7]p.6 หมายถึง กลุ่มของข้อมูล หรือรูปแบบของแหล่งข้อมูลที่ถูกจัดเก็บในลักษณะฐานข้อมูล (Database) โดยอาศัยรูปแบบของตาราง เป็นตัวสร้างความสัมพันธ์ระหว่างข้อมูลที่จัดเก็บอยู่ในแต่ละตาราง โดยที่ถ้ามองข้อมูลในลักษณะแนวนอน (Row) จะเรียกว่า เร็คคอร์ด (Record) แต่ถ้ามองในลักษณะแนวตั้ง (Column) จะถูกเรียกว่าฟิลด์ (Field) หรือตำราบางเล่มจะใช้คำว่า แอตทริบิวต์ (Attribute) ก็ได้
ADO (ActiveX Data Objects) คือ เทคโนโลยีที่ช่วยให้แอพพลิเคชั่นต่าง ๆ สามารถเข้าถึงข้อมูลใดใด โดยอาศัยการเชื่อมต่อผ่าน OLE DB ซึ่งเป็นการอินเตอร์เฟสระดับล่าง
OLEDB (Object Linking and Embedding Database) คือ API ที่ออกแบบโดยไมโครซอฟท์สำหรับเชื่อมต่อกับหลากหลายฐานข้อมูลในรูปแบบที่เหมือนกัน ซึ่งออกแบบมาใช้แทน ODBC โดยได้เพิ่มความสามารถในการติดต่อกับฐานข้อมูลประเภทอื่นๆ เช่น สเปรดชีต เป็นต้น
Recordset คือ วัตถุที่เก็บระเบียนข้อมูลของทั้งตาราง ที่เป็นผลของการ query ข้อมูล
คำสั่งต่าง ๆ
set conn = server.createobject("adodb.connection") สร้าง conn แบบ connection
การ .open ถ้าเปิดผ่าน connection ก็ไม่ต้องเปิดผ่าน recordset ต้องเลือกเปิดเพียง 1 วิธี
set rs = server.createobject("adodb.recordset") สร้าง rs แบบ recordset
การ .open ผ่าน recordset มีรูปแบบคือ rs.Open Source, Connection, CursorType, LockType, Option
rs.open sql, conn, 1, 3
Source คือ แหล่งที่มาของข้อมูล มักเป็นคำสั่ง SQL
Connection คือ การติดต่อฐานข้อมูล
CursorType คือ ชนิดการเลื่อนของ pointer
adOpenForwardOnly มีค่า CursorType เท่ากับ 0 (default) เลื่อนไปข้างหน้าได้อย่างเดียว
adOpenKeySet มีค่า CursorType เท่ากับ 1 เลื่อนตัวชี้ไปมาได้อิสระ เห็นผลอัพเดท แต่ลดเพิ่มจะไม่เห็น
adOpenDynamic มีค่า CursorType เท่ากับ 2 คล้ายแบบ 1 อ่านลงหน่วยความจำและอัพเดทเสมอ
adOpenStatic มีค่า CursorType เท่ากับ 3 คล้ายแบบ 1 อ่านลงหน่วยความจำแต่ไม่อัพเดท
LockType คือ ชนิดการ Lock ของ Cursor ซึ่งมีความสัมพันธ์โดยตรงกับ CursorType
adLockReadOnly มีค่า LockType เท่ากับ 1 (default) อ่านได้อย่างเดียว
adLockPessimistic มีค่า LockType เท่ากับ 2 เป็นข้อมูลได้ครั้งละคน
adLockOptimistic มีค่า LockType เท่ากับ 3 เปลี่ยนพร้อมกันได้หลายคน
adLockBatchOptimistic มีค่า LockType เท่ากับ 4 คล้ายแบบ 3 แต่เปลี่ยนได้ครั้งละมาก ๆ
+ http://www.w3schools.com/asp/met_rs_open.asp
Download : dthai97.mdb และ dthai2013.accdb และ dthai100k.zip
รวมโค้ดอ่านฐานข้อมูล
ตัวอย่าง dlist1.asp : 
การเชื่อมต่อฐานข้อมูลแบบ DSNLess เข้า Microsoft access ใช้ open ผ่าน recordset จึงใช้ recordcount ได้
<%
set rs = server.createobject("adodb.recordset")
' conn = "driver={microsoft access driver (*.mdb)}; dbq=d:\thaiall.com\asp\dthai97.mdb;"
' conn = "driver={microsoft access driver (*.mdb)}; dbq=" & server.mappath("dthai97.mdb")
conn = "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai97.mdb")
sql = "select * from tbthai"
rs.open sql, conn, 1, 3
response.write("Total record : "& rs.recordcount & "<br>")
do while not rs.eof
  response.write(rs("fid") & " " & rs("fname") & " " & rs("fsalary") & "<br>")
  rs.MoveNext
loop
rs.close
set rs = nothing
%>

ตัวอย่าง dlist2.asp : 
การเชื่อมต่อฐานข้อมูลแบบ DSNLess เข้า Microsoft access ใช้ execute SQL ผ่าน connection
<%
set conn = server.createobject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai97.mdb")
sql = "select * from tbthai"
set rs = conn.execute(sql)
do while not rs.eof
  response.write(rs("fid") & " ")
  response.write(rs("fname") & " ")
  response.write(rs("fsalary") & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>

ตัวอย่าง dlist3.asp :
การเชื่อมต่อฐานข้อมูลแบบ DSNLess เข้า Microsoft access ใช้ execute SQL ผ่าน connection 
คล้ายแบบที่ dlist2.asp ต่างกันที่ ส่วนของการแสดงผลภายใน loop และเพิ่มตัวอย่างการเชื่อมต่อแบบต่าง ๆ
<%
set conn = server.createobject("adodb.connection")
' conn.open "provider=microsoft.jet.oledb.4.0; data source=c:\thai.xls; extended properties=""excel 8.0; hdr=yes"";"
' conn.open "driver={mysql}; server=localhost; database=dthai; uid=; pwd=;"
' conn.open "driver={sql server}; server=localhost; database=dthai; uid=sa; pwd=;"
' conn.open "driver={microsoft odbc for oracle}; server=oracleserver; uid=; pwd=;"
' conn.open "driver={microsoft access driver (*.mdb)}; dbq=" & server.mappath("dthai97.mdb")
' conn.open "driver={microsoft access driver (*.mdb)}; dbq=d:\thaiall.com\asp\dthai97.mdb;"
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai97.mdb")
' conn.execute("delete * from tbthai") บรรทัดนี้เพิ่มได้ แต่ผลคือไม่แสดงอะไรนะครับ
set rs = conn.execute("select * from tbthai")
do while not rs.eof
  response.write(rs("fid") & " " & rs("fname") & " " & rs("fsalary") & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>

ตัวอย่าง dlist4.asp :
การเชื่อมต่อฐานข้อมูลแบบ DSN (Data Source Name) ใน ODBC และไม่ใช้ recordset
<%
' xdthai97 คือ Data Source Name ที่ถูกสร้างด้วย ODBC Data source ใน control panel
' ให้เลือก User DSN, Add, Microsoft Access Drriver.. , Finish
' แล้วพิมพ์ xdthai97 ในช่อง Data Source Name แล้วอย่าพึ่งกดปุ่ม OK
' ให้กดปุ่ม Select เพื่อเลือกแฟ้มชื่อ dthai97.mdb ที่อยู่ในคอมพิวเตอร์ แล้วกดปุ่ม OK
' ผลการเพิ่ม จะพบ xdthai97 อยู่ในส่วนของ User DSN ซึ่งจะชี้ไป dthai97.mdb อัตโนมัติ
' conn.open "dsn=xdthai97;uid;pwd;" ก็ใช้ได้
set conn = server.createobject("adodb.connection")
conn.open "xdthai97", "", ""
sql = "select * from tbthai"
set rs = conn.execute(sql)
do while not rs.eof
  response.write(rs("fid") & " " & rs("fname") & " " & rs("fsalary") & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>

ตัวอย่าง dlist5.asp :
การเชื่อมต่อฐานข้อมูลแบบ DSN (Data Source Name) ใน ODBC และใช้ recordset
ถ้าใช้ recordset ก็จะใช้ rs.recordcount ได้
ทดสอบ DSN ที่เชื่อมต่อกับ MYSQL ในเครื่องที่ลง MYODBC แล้วก็ ok มีตัวอย่างที่ http://www.thaiall.com/mysql เช่นกัน
<%
set conn = server.createobject("adodb.connection")
conn.open "xdthai97", "", ""
set rs = server.createobject("adodb.recordset")
sql = "select * from tbthai"
rs.open sql, conn, 1, 3
do while not rs.eof
  response.write(rs("fid") & " " & rs("fname") & " " & rs("fsalary") & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>

ตัวอย่าง dlist6.asp :
การเชื่อมต่อฐานข้อมูล MYSQL ในเครื่องที่ลง MYODBC มีตัวอย่างที่ http://www.thaiall.com/mysql
ถ้าเครื่องที่เชื่อมต่อชื่อ localhost ฐานข้อมูลชื่อ test ส่วน user และ password คือ u และ p
<%
set conn = Server.CreateObject("adodb.connection")
userpassword = "Database=test;uid=u;password=p;"
conn = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;" & userpassword
conn.Open conn
set rs = conn.Execute("select * from customer")
' response.write(rs.recordcount) ต้องใช้ recordset
do while not rs.eof
  response.write(rs("custid") & " " & rs("custname") & "<br>")
  rs.movenext
loop
conn.close
set rs = nothing
set conn = nothing
%>

ตัวอย่าง dlist7.asp :
การเชื่อมต่อกับฐานข้อมูล Microsoft Access 2013 บน win 8.1 คล้ายแบบที่ 1 ใช้ recordset อย่างเดียว
ซึ่งรุ่นนี้ไม่สามารถเปิดแฟ้ม .mdb และเชื่อมต่อได้ด้วย microsoft access driver [dthai2013.accdb]
<%
set rs = server.createobject("adodb.recordset")
conn="driver={microsoft access driver (*.mdb, *.accdb)};dbq=c:\inetpub\wwwroot\x.accdb;"
'conn="driver={microsoft access driver (*.mdb, *.accdb)};dbq=" & server.mappath("x.accdb")
sql = "select * from tbthai"
rs.open sql, conn, 1, 3
do while not rs.eof
  response.write(rs("fid") & " " & rs("fname") & " " & rs("fsalary") & "<br>")
  rs.MoveNext
loop
rs.close
set rs = nothing
%>
ตัวอย่าง dlist8.asp :
การเทียบเวลาการ loop หลังเชื่อมต่อแบบ connection กับ recordset [dthai100k.zip]
<%
con1 ' 250ms
con2 ' 430ms
con1 ' 249ms 
function con1()
  dim tstart
  sql = "select * from tbthai"
  set cn1 = server.createobject("adodb.connection")
  cn1.open "provider=microsoft.jet.oledb.4.0; data source="& server.mappath("dthai100k.mdb")
  set rs1 = cn1.execute(sql)
  tstart = timer
  do while not rs1.eof
    rs1.MoveNext
  loop
  response.write(((timer - tstart) * 1000) & "ms<br/>")
  set cn1 = nothing
end function
function con2()
  set rs2 = server.createobject("adodb.recordset")
  cn2 = "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai100k.mdb")
  sql = "select * from tbthai"
  rs2.open sql, cn2, 1, 3
  tstart = timer
  do while not rs2.eof
    rs2.MoveNext
  loop
  response.write(((timer - tstart) * 1000) & "ms<br/>")
  rs2.close
  set rs2 = nothing
  set cn2 = nothing
end function
%>
การอ่านชื่อเขตข้อมูล (Field name) แบบไม่เปิด connection
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai97.mdb")
for each fld in rs.fields
  response.write(fld.name & " ")
next
rs.close
set rs = nothing
การอ่านชื่อเขตข้อมูล (Field name) แบบเปิด connection
set conn = server.createobject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai97.mdb")
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", conn
for each fld in rs.fields
  response.write(fld.name & " ")
next
rs.close
conn.close
set rs = nothing
set conn = nothing
การใช้ movenext และเชื่อมต่อแบบ recordset
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai97.mdb")
response.write(rs.fields(0) & " " & rs.fields(1))
rs.movenext
response.write(rs.fields(0) & " " & rs.fields(1))
rs.movenext
response.write(rs.fields(0) & " " & rs.fields(1))
rs.close
set rs = nothing
การใช้ movelast, moveprevious และเชื่อมต่อแบบ connection
set conn = server.createobject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("dthai97.mdb")
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", conn, 1, 3 
response.write(rs.fields(0) & " " & rs.fields(1) & rs.absoluteposition)
rs.movelast
response.write(rs.fields(0) & " " & rs.fields(1) & rs.absoluteposition)
rs.moveprevious
response.write(rs.fields(0) & " " & rs.fields(1) & rs.absoluteposition)
rs.close
set rs = nothing
การ move ไปยังระเบียนที่ต้องการ โดยเริ่ม 0 แต่ position เริ่ม 1
set conn = server.createobject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("../access_db/dthai97.mdb")
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", conn, 1, 3 
rs.move 2
response.write(rs.fields(0) & " " & rs.fields(1) & rs.absoluteposition)
session("i") = rs.absoluteposition
rs.movefirst
rs.move 3
response.write(rs.fields(0) & " " & rs.fields(1) & rs.absoluteposition)
rs.movefirst
rs.move 0
response.write(rs.fields(0) & " " & rs.fields(1) & rs.absoluteposition)
rs.movefirst
rs.move session("i")
response.write(rs.fields(0) & " " & rs.fields(1) & rs.absoluteposition)
rs.close
การ addnew
set conn = server.createobject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("../access_db/dthai97.mdb")
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", conn, 1, 3 
rs.addnew
rs("fname") = "ทดสอบ"
rs("fsalary") = "15000"
rs.update
การ update
set conn = server.createobject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("../access_db/dthai97.mdb")
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", conn, 1, 3 
rs.movelast
rs("fsalary") = "20000"
rs.update
การ delete
set conn = server.createobject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("../access_db/dthai97.mdb")
set rs = server.createobject("adodb.recordset")
rs.open "tbthai", conn, 1, 3 
rs.movelast
rs.delete
rs.movenext
การจัดการแฟ้มตัวอักษร
แสดงการสร้างแฟ้ม และอ่านข้อมูลมา split แยกเขตข้อมูล ทดสอบที่ http://www.thaiabc.com/access_db/create_text.asp
<%
set ftxt=createobject("scripting.filesystemobject")
set ln1 = ftxt.createtextfile(server.mappath("x.txt"),true)
ln1.writeline("ทดสอบ:1")
ln1.writeline("ทดสอบ:2")
ln1.writeline("ทดสอบ:3")
ln1.writeline("ทดสอบ:4")
ln1.writeline(date())
ln1.close
response.write "Create file : ok<br/>"
set ln2 = ftxt.opentextfile(server.mappath("x.txt"))
do while not ln2.atendofstream
 ar = split(ln2.readline,":",-1,1)
 response.write(ar(0))
 if (ubound(ar) > 0) then 
   response.write(ar(1) & "<br/>")
 end if
loop
%>
ตัวอย่าง upd_dthai97.asp
รวมการ เพิ่ม ลบ แก้ไข และแสดง ในโปรแกรเดียวกัน และทำงานร่วมกับ iframe
ตัวอย่าง Web Screen
Addandlist.asp ( ทดสอบที่ 7host.com : ok )
Download : dthai97.mdb 70 KB 
โปรแกรมเพิ่มข้อมูล และแสดงผลอย่างง่าย ๆ ใน Microsoft Access ด้วยภาษา ASP
<body><font size="0">
<form action=addandlist.asp method=post>
fid: <input name=fid>
fname: <input name=fname>
fsalary: <input name=fsalary>
<input type=submit>
</form>
<a href=addandlist.asp>list</a><hr>
<%
if (request.form("fid") > 0) then
  set conn = server.createobject("ADODB.Connection")
  servermap = server.mappath("dthai97.mdb")
  conn.open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & servermap
  sql = "insert into tbthai ( fid, fname, fsalary ) SELECT "
  sql = sql & " " & request.form("fid") & " as fid, "
  sql = sql & " '" & request.form("fname") & "' as fname, "
  sql = sql & " " & request.form("fsalary") & " as fsalary; "
  set rs = conn.Execute(sql)
  conn.close
  set conn = nothing
else
  set conn = server.createobject("adodb.connection")
  conn.open "provider=microsoft.jet.oledb.4.0; data source=" & servermap
  response.write(server.mappath("dthai97.mdb") & "<br>")
  sql = "select * from tbthai"
  set rs = conn.execute(sql)
  do while not rs.eof
    response.write(rs("fid")&rs("fname")&rs("fsalary")&"<br>")
    rs.MoveNext
  loop
  conn.close
  set rs = nothing
  set conn = nothing
end if
%>
</body>
การเชื่อมต่อแบบอื่น
Other Connection String : http://www.carlprothman.net/Default.aspx?tabid=81
1. การเชื่อมต่อฐานข้อมูลแบบ OLEDB Provider ด้วย Active Directory service
conn.open "PROVIDER=ADSDSObject;USER ID=Admin;PASSWORD=;"
2. การเชื่อมต่อฐานข้อมูลแบบ OLEDB Provider ด้วย Microsoft SQL server (ธรรมดา)
conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL Server;" &_
"INITIAL CATALOG=Member;USER ID=sa;PASSWORD=;"
3. การเชื่อมต่อฐานข้อมูลแบบ OLEDB Provider ด้วย Microsoft SQL server (IP address)
conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=202.29.0.1, 1433;" &_
"NETWORK LIBRARY=DBMSSOCN;INITIAL CATALOG=Member;USER ID=sa;PASSWORD=;"
4. การเชื่อมต่อฐานข้อมูลแบบ OLEDB Provider ด้วย Microsoft excel
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=c:\member.xls;"&_
"extended properties=""Excel 8.0; HDR=Yes"";"


การอ่านข้อมูลจาก .xls ด้วย ASP
:: ตัวอย่างนี้กำหนด ชื่อ พื้นที่ ที่จะ select ข้อมูลมาใช้
:: Right click to download [ dthai97.xls 13 KB  :: dthai2007.xlsx 12 KB ]

<%
fxls = "dthai97.xls"
tbname = "dthai1"
f1 = "eid"
f2 = "ename"
' ===============================================
' 2 method : ok
' dv = "driver={microsoft excel driver (*.xls)}; dbq=" & server.mappath(fxls)
' dv = dv & "; extended properties='excel 8.0; hdr=yes';"
dv = "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath(fxls)
dv = dv & "; extended properties='excel 8.0; hdr=yes';"
set conn = server.createobject("adodb.connection")
conn.open dv
sql = "select * from " & tbname
set rs = conn.execute(sql)
do while not rs.eof
  response.write(rs(f1) & " " & rs(f2) & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>

โปรแกรมเชื่อมตารางด้วย inner join กับ left join และตรวจสอบว่ามีข้อมูลหรือไม่
ทำงานใน win7 เชื่อมแฟ้ม excel จาก office2007 กับ asp classic
ส่วน loop ที่สองจะ group ข้อมูล แล้วนับจำนวน โดยไม่เชื่อมโยงเพื่อใช้เป็น key ในการจัดกลุ่ม
<%
dv ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
dv = dv & server.mappath("dthai2007.xlsx")
dv = dv & ";Extended Properties='Excel 12.0 Xml;HDR=YES';"
' ---
set conn = server.createobject("adodb.connection")
conn.open dv
' ---
' show all from [left]
sql = "select * from dthai2 left join dthai3 on dthai2.eid = dthai3.eidg"
' show if match 2 table
' sql = "select * from dthai2 inner join dthai3 on dthai2.eid = dthai3.eidg"
set rs = conn.execute(sql)
do while not rs.eof
  if (isnull(rs("group"))) then response.write("*") 
  response.write(rs("eid") & " " & rs("ename") & " " & rs("group") & "<br>")
  rs.MoveNext
loop
' ---
sql = "select first(dthai3.group) as x,count(dthai3.group) as y from dthai3" 
sql = sql & " group by dthai3.group"
set rs = conn.execute(sql)
do while not rs.eof
  response.write(rs("x") & rs("y") & "<br>")
  rs.MoveNext
loop
conn.close
set rs = nothing
set conn = nothing
%>


โปรแกรมเชื่อมตารางซ้อนตาราง อ่านข้อมูลจาก excel ผ่านชื่อ โดยทดสอบกับ dthai2007.xlsx
<table align=center border=1 width=400>
<%
dv ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
dv = dv & server.mappath("dthai2007.xlsx")
dv = dv & ";Extended Properties='Excel 12.0 Xml;HDR=YES';"
set conn = server.createobject("adodb.connection")
conn.open dv
' ---
sql = "select first(dthai3.group) as x,count(dthai3.group) as y from dthai3"
sql = sql & " group by dthai3.group"
set rs = conn.execute(sql)
do while not rs.eof
  response.write("<tr bgcolor=yellow><td colspan=2>" & rs("x") & "</td>")
  sqlx = "select * from dthai2 inner join dthai3 "
  sqlx = sqlx & "on dthai2.eid = dthai3.eidg "
  sqlx = sqlx & "where dthai3.group ='" & rs("x") & "'"
  set rsx = conn.execute(sqlx)
  do while not rsx.eof
    response.write("<tr bgcolor=#ddffdd>")
    response.write("<td>" & rsx("eid") & "</td>")
    response.write("<td>" & rsx("ename") & "</td></tr>")
    rsx.MoveNext
  loop
  rs.MoveNext
loop
'---
conn.close
set rs = nothing
set conn = nothing
%>
</table>

คำถาม-คำตอบ
ถาม 1 หนุ่มคนหนึ่ง อยากรู้ชื่อ Directory ในเครื่องบริการของตน
ตอบ ผมจึงตอบว่า เอา code ข้างล่างนี้ไป run ดูสิ
for each Item in request.servervariables
response.write Item & " = "
response.write request.servervariables(Item) & "<br>"
next

ถาม 2 ชื่อ field ที่ไม่ควรใช้
ตอบ position, desc เป็นต้น
ถาม 3 แปลงอักษรเป็นวันที่
ตอบ
a = "12"
b = "31"
c = "49"
d = a & "/" & b & "/" & c
e = CDate(d)
response.write(Formatdatetime(e,1))

ถาม 4 ฟังก์ชันเขียนอย่างไร
ตอบ
response.write(a(5))
function a(b)
a = b * 2
end function

ถาม 5 split ใช้งานอย่างไร
ตอบ
dim a,n,s
s = request.servervariables("PATH_TRANSLATED")
a = split(s,"\")
n = a(0)
for i=1 to ubound(a) - 1
n = n & "\" & a(i)
next
response.write n
ถาม 6 การวางตัวแปรในลิงค์ของ HTML แบบใช้ session จะเขียนอย่างไร
ตอบ
<% 
session("a") = 5
%>
<a href=link.asp?id=<%=session("a") %>>one : ok</a>
<a href='link.asp?id=<%=session("a") %>'>two : ok</a>
<a href="link.asp?id=<%=session("a") %>">three : ok</a>
<%=len(request.querystring("id"))%>
first time is zero

ถาม 7 การลบ หรือนับ session เขียนอย่างไร
ตอบ
<%
session("a")="burin"
session("b")=cint(session("b")) + cint(1)
session("c")=100
b = session("b")
dim i,j
j=Session.Contents.Count
Response.Write("Session variables = " & j)
session.contents.remove("a")
For i= 1 to j
  Response.Write("<br>" & Session.Contents(i)) 
Next
For Each i in Session.Contents
  Response.Write("<br>" & i) 'b c
Next
Response.Write(Session.Contents.Count) '2
Session.Contents.RemoveAll()
Response.Write(Session.Contents.Count) '0 
session("b")=b
' session.Abandon ' will effect on next page
%>

ถาม 8 ถ้าเชื่อมอาร์เรย์กับเซสชัน จะเขียนโปรแกรมอย่างไร
ตอบ
<%
dim sex(5)
sex(1) = "m"
sex(2) = "f"
sex(3) = "m"
session("m") = "male"
session("f") = "female"
for i = 1 to ubound(sex)
  for Each s in Session.Contents
    if (s = sex(i)) then
      response.Write(s & " " &session(s))
    end if
next
next
%>
ถาม 9 ถ้าเรียก sub จากการ include โดยส่งค่าไปคำนวณ ผ่าน local var ต้องเขียนอย่างไร
ตอบ<!--#include file="mysub.asp"-->
<%
for i = 1 to 5
call mysub(i)
next
%>
' mysub.asp
<%
sub mysub(i)
dim sum
sum = 0
for j = 1 to i
  sum = sum + j
next
response.write(sum & "<br/>")
end sub
%>

คำสั่งน่ารู้
  1. เปลี่ยน single quote ที่รับจากฟอร์มเป็นรหัสพิเศษ
    m = replace(request.querystring("messages"),chr(39),"'")
    เพื่อแก้ปัญหาส่งข้อมูลไม่เข้า หากรับเครื่องหมาย ' เข้าไปใน text หรือ textarea จะทำให้ error
  2. เก็บค่าจาก form ที่ใช้ method post เข้า session
    session("a") = request.form("a")
  3. เก็บค่าจาก form ที่ใช้ method get เข้า session
    session("a") = request.querystring("a")
  4. นำค่าจาก session ที่เก็บไว้มาใช้
    response.write(session("a"))
  5. นั่งคิดอยู่ตั้งนานว่าจะหยุดการทำงานได้อย่างไร จะใช้ exit ดีไหม สรุปว่า อ.ถนอม ช่วยเฉลยครับ
    response.end
  6. ย้ายจากเว็บเพจเดิม ไปหน้าใหม่ทันที คล้ายคำสั่ง header("Location: http://www.thaiall.com"); ในภาษา PHP
    response.redirect("http://www.thaiall.com")
  7. เรียก External File มาใช้ คล้าย require หรือ include ใน php และใช้ได้ทั้งสกุล inc และ asp
    <!--#include file="wisdom.inc"-->
    <!--#include file="wisdom.asp"-->
  8. แสดงเวลาแบบต่าง ๆ เช่น 28/9/2549 14:55:11
    response.write(date() & now() & time() & month(date()) & day(date()) & year(date()))
    response.write(hour(now()) & minute(now()) & second(now()) & weekday(now()))
    response.write(formatdatetime(now(),vbgeneraldate) & formatdatetime(now(),vblongtime))

    dim t
    t = timer
    response.write(t)
    output : 11/15/201411/15/2014 3:11:57 AM3:11:57 AM1115201431157711/15/2014 3:11:57 AM3:11:57 AM11517.09
  9. ตรวจสอบการเป็นตัวเลข ถ้าส่งตัวอักษรเข้า SQL จะมีปัญหา จึงต้องแปลงก่อน
    username1 = 0
    if isnumeric(request.form("username1")) then username1 = request.form("username1")
  10. การลบแฟ้มออกจาก server
    dim filename, fs, f
    filename = "c:\wwww\gallery\" & request.querystring("id") & ".jpg"
    set fs=Server.CreateObject("Scripting.FileSystemObject")
    if fs.FileExists(filename) then
    set f=fs.GetFile(filename)
    f.Delete
    end if

    ลบแฟ้มในห้องที่กำหนดจาก GET เช่น x.asp?id=5
    http://www.thaiall.com/asp/folderpermission.gif
ตัวอย่างรหัสต้นฉบับจากหนังสือ
2101. intro/default.asp
2102. intro/function.asp
2103. intro/p01.asp
2104. intro/p02.asp
2105. intro/p03.asp
2106. intro/p04.asp
2107. intro/randomeasy.asp
2108. intro/randomarray.asp
2109. intro/numtochar.asp
2201. sort/default.asp
2202. sort/bubble.asp
2203. sort/newbubble.asp
2204. sort/insertion.asp
2205. sort/selection.asp
2206. sort/shell.asp
2301. keepvar/default.asp
2302. keepvar/addapplication.asp
2303. keepvar/addsession.asp
2304. keepvar/removeappl.asp
2305. keepvar/addsubj.asp
2401. textsearch/search.dat
2402. textsearch/default.asp
2403. textsearch/crtsearch.asp
2404. textsearch/listsearch.asp
2405. textsearch/find.asp
2406. textsearch/delrec.asp
2407. textsearch/restore.asp
2502. updatemdb/default.asp
2503. updatemdb/crttab.asp
2504. updatemdb/selecttab.asp
2505. updatemdb/inserttmpch.asp
2506. updatemdb/insert6.asp
2507. updatemdb/searchtmpch.asp
2508. updatemdb/edittmpnum.asp
2509. updatemdb/controlrec.asp
2510. updatemdb/deltmpch.asp
2511. updatemdb/droptab.asp
2602. quiz/default.htm
2603. quiz/displayq.asp
2604. quiz/displayqz.asp
2605. quiz/quizauto.asp
2606. quiz/quizjv.asp
2701. emailconfirm/default.asp
2702. emailconfirm/checkpass.asp
2703. emailconfirm/sendmail.asp
2801. creditcard/default.asp
2802. creditcard/ccard.inc
2902. casereg/default.htm
2903. casereg/listpage.asp
2904. casereg/groupadv.asp
2905. casereg/regist.asp 
Alphabetic Keyword List
+ แหล่งอ้างอิง http://www.csidata.com/custserv/onlinehelp/VBSdocs/vbsalp2.htm
+ แหล่งอ้างอิง http://www.piclist.com/techref/language/asp/vbs/vbscript/keyword.htm
+ แหล่งอ้างอิง http://www.csidata.com/custserv/onlinehelp/vbsdocs/vbsalp2.htm
Abs Add Method AddFolders Method Addition Operator (+) And Operator Array Asc Assignment Operator (=) AtEndOfLine Property AtEndOfStream Property Atn Attributes Property AvailableSpace Property BuildPath Method Call Statement CBool CByte CCur CDate CDbl Chr CInt Clear Method CLng Close Method Column Property CompareMode Property Concatenation Operator (&) Const Statement Copy Method CopyFile Method CopyFolder Method Cos Count Property CreateFolder Method CreateObject CreateTextFile Method CSng CStr Date DateAddFunction DateCreated Property DateDiff DateLastAccessed Property DateLastModified Property DatePart DateSerial DateValue Day Delete Method DeleteFile Method DeleteFolder Method Description Property Dictionary Object Dim Statement Division Operator (/) Do...Loop Statement Drive Object Drive Property DriveExists Method DriveLetter Property Drives Collection Drives Property DriveType Property Empty Eqv Operator Erase Statement Err Object Exists Method Exit Statement Exp Exponentiation Operator (^) False FileExists Method File Object Files Collection Files Property FileSystemObject Object FileSystem Property Filter Fix Folder Object Folders Collection FolderExists Method For...Next Statement For Each...Next Statement FormatCurrency FormatDateTime FormatNumber FormatPercent FreeSpace Property Function Statement GetAbsolutePathName Method GetBaseName Method GetDrive Method GetDriveName Method GetExtensionName Method GetFile Method GetFileName Method GetFolder Method GetObject GetParentFolderName Method GetSpecialFolder Method GetTempName Method Hex HelpContext Property HelpFile Property Hour If...Then...Else Statement Imp Operator InputBox InStr InStrRev Int Integer Division Operator (\) Is Operator IsArray IsDate IsEmpty IsNull IsNumeric IsObject IsReady Property IsRootFolder Property Item Property Items Method Join Key Property Keys Method LBound LCase Left Len Line Property LoadPicture Log LTrim Mid Minute Mod Operator Month MonthName Move Method MoveFile Method MoveFolder Method MsgBox Muliplication Operator (*) Name Property Negation Operator (-) Not Operator Now Nothing Null Number Property Oct On Error Statement OpenAsTextStream Method OpenTextFile Method Operator Precedence Option Explicit Statement Or Operator ParentFolder Property Path Property Private Statement Public Statement Raise Method Randomize Statement Read Method ReadAll Method ReadLine Method ReDim Statement Rem Statement Remove Method RemoveAll Method Replace RGB Right Rnd RootFolder Property Round RTrim ScriptEngine ScriptEngineBuildVersion ScriptEngineMajorVersion ScriptEngineMinorVersion Second Select Case Statement SerialNumber Property Set Statement Sgn ShareName Property ShortName Property ShortPath Property Sin Size Property Skip Method SkipLine Method Source Property Space Split Sqr StrComp String StrReverse Sub Statement SubFolders Property Subtraction Operator (-) Tan Time TextStream Object TimeSerial TimeValue TotalSize Property Trim True Type Property TypeName UBound UCase VarType VolumeName Property Weekday WeekdayName While...Wend Statement Write Method WriteBlankLines Method WriteLine Method Xor Operator Year
พบปัญหาว่า เมื่อเข้า localhost แล้วถาม user & password
การแก้ปัญหา
เริ่มต้น start IIS6 บน WinXP แล้ว พบว่า ติดปัญหา authentication ต้อง mark: check box ให้ Integrated Windows authentication ไม่งั้นก็เข้า server ผ่าน localhost หรือ 127.0.0.1 ไม่ได้ หลังเข้าได้แล้ว ก็ลบ localstart.asp ได้เลย เพราะไม่ได้ใช้แฟ้มนี้ จากนั้นก็สร้าง default.asp ของตนเอง หลังกด apply ต้องเลือก select all ให้มีผลต่อทุกแฟ้ม มิเช่นนั้นจะขึ้น user & password มาถามอีก
พบปัญหาว่า เชื่อมต่อ DSN แบบเดิมไม่ได้
การแก้ปัญหา
หลายปีก่อนใช้ WinXP ติดต่อกับ ODBC ผ่าน Microsoft Access Driver(*.mdb) ผ่าน User DSN ได้ แต่มาวันนี้ทดสอบในห้อง LAB พบว่าติดต่อไม่ได้ (รู้สึกคล้ายตนเองทำ reproducible เหมือนกรณีงานวิจัย stem cell ของนักวิทยาศาสตร์ระดับแถวหน้าของญี่ปุ่น) เรื่องนี้คาดว่าลงได้ลง Office 2007/2010 ทำให้ driver เปลี่ยนไป สรุปว่าต้องเปลี่ยนการติดต่อเป็นเลือก System DSN แล้วเลือก Microsoft Access Driver(*.mdb, *.accdb) จากนั้นก็สร้าง DSN name แล้ว select แฟ้ม dthai97.mdb
การปรับให้ upd_dthai97.asp ใช้บน iis8.5 ใน win8.1
การทำให้ใช้ .asp กับ .mdb
1. right click บน start เลือก control panel
2. Program and Features, Turn Windows features on or off
3. check : Internet Information Services (Win8.1 have IIS 8.5)
and World Wide Web Services, Application Development Features
and ASP + ISAPI Extensions
การทำให้สร้างแฟ้มในห้อง wwwroot
4. right click on c:\inetpub\wwwroot, security, add your name, adding full control
5. edit x.asp in wwwroot
การทำให้คำสั่ง insert, delete, update ใน sql ทำงานได้กับ microsoft.jet.oledb.4.0
6. right click on c:\inetpub\wwwroot\x.mdb, security, add everyone, adding full control
Tag ในภาษา HTML
ตัวอย่าง code ที่เกี่ยวกับฟอร์ม
เช่น text, checkbox, radio, select, textarea, submit
<form action=x.asp method=post>
<input type=text name=a value="boy"><br>
<input type=checkbox name=b checked><br>
<input type=radio name=c value="A"><br>
<input type=radio name=c value="B"><br>
<input type=radio name=c value="C"
checked><br>
<select name=d size=4>
<option value=th>Thailand
<option value=us selected>United State
<option value=jp>Japan
</select><br>
<textarea name=e rows=4 cols=20>hello</textarea>
<input type=submit name=f value=click>
</form>
โปรแกรมสำหรับ Upload แฟ้มเข้าเครื่องบริการ
การอัพโหลดแฟ้มเข้าเครื่องบริการ ด้วย asp classic มักต้องใช้ class หรือ module ที่ include file จากที่เคยพัฒนาไว้ เพื่อทำหน้าที่ช่วย upload แฟ้มโดยเฉพาะ โปรแกรมนี้ได้นำ code มาจาก freeaspupload.net ซึ่งปรับให้ใช้งานได้ทันทีกับ wwwroot โดยไม่ต้องมีตัวรับตัวส่งแยกกัน และสามารถกำหนด destination folder ได้
+ pure-asp-file-upload
+ aspupload.com
Photo Gallery by AJAX
การเขียนโปรแกรม html กำหนด ให้ใช้ XMLHttpRequest() แล้วร้องขอข้อมูลผ่าน ASP หรือ PHP ซึ่งเป็นการเขียนแบบ AJAX สามารถประยุกต์ได้หลายวิธี ตัวอย่างด้านขวานี้เป็นระบบนำเสนอ photo gallery แบบมีปุ่ม previous และ next ซึ่งมีตัวอย่างอื่นที่ AJAX

photo.mdb 248 KB
' version 1.2557-11-25
' http://www.thaiabc.com/asp/photo.asp?action=n&photo=one.jpg
' test in http://www.thaiabc.com/ajax/photo/
q_act = request.querystring("action")
q_photo = request.querystring("photo")
set rs = server.createobject("adodb.recordset")
conn = "provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("photo.mdb")
sql = "select * from photo"
rs.open sql, conn, 1, 3
rs.movelast
v_last = rs("photo")
old = rs("photo") ' is last
rs.movefirst
v_first = rs("photo")
do while not rs.eof
  if (rs("photo") = q_photo and q_act = "p") then exit do
  if (rs("photo") = q_photo and q_act = "n") then
    rs.MoveNext
    if (not rs.eof) then old = rs("photo")  else old = v_first
    exit do
  end if
  old = rs("photo") 
  rs.MoveNext
loop
rs.close
set rs = nothing
if(len(q_photo) = 0) then response.write(v_first) else response.write(old)
เอกสารอ้างอิง
[1] เรวัตร ธรรมาอภิรมย์, "เจาะลึกเทคโนโลยีใหม่ Microsoft .net Framework", บริษัท เอส.พี.ซี.พริ้นติ้ง จำกัด, กรุงเทพฯ, 2544.
[2] พร้อมเลิศ หล่อวิจิตร, "คู่มือเรียน Visual Basic 2005", บริษัท โปรวิชั่น จำกัด., กรุงเทพฯ, 2549.
[3] ธวัชชัย สุริยะทองธรรม, "พัฒนาเว็บแอพพลิเคชั่น ASP.NET", บริษัท ซัคเซส มีเดีย จำกัด., กรุงเทพฯ, 2548.
[4] ยุทธนา ลีลาศวัฒนกุล, "คู่มือการเขียนโปรแกรมและใช้งาน Visual C++.NET", สำนักพิมพ์อินโฟเพรส, กรุงเทพฯ, 2546.
[5] กิตติ ภักดีวัฒนะกุล, จำลอง ครูอุตสาหะ, "ASP ฉบับโปรแกรมเมอร์", บริษัท เคทีพี คอมพ์ แอนด์ คอนซัลท์ จำกัด., กรุงเทพฯ, 2543.
[6] ศุภชัย สมพานิช, "การเขียนโปรแกรมอย่างมืออาชีพด้วย .NET Framework", บริษัท ไอดีซี พรีเมียร์ จำกัด., นนทบุรี, 2554.
[7] ศุภชัย สมพานิช, "Database Programming ด้วย VB 2008 & VC# 2008", บริษัท ไอดีซี พรีเมียร์ จำกัด., นนทบุรี, 2551.
[8] ศุภชัย สมพานิช, "Database Programming ด้วย VB 2005 & VC# 2005 ฉบับสมบูรณ์", บริษัท ไอดีซี พรีเมียร์ จำกัด., นนทบุรี, 2549.
rspsocial
Thaiall.com