VBScript似乎已经成为ASP服务器端开发的首先语言,VBScript函数库丰富、而且使用起来也很容易上手,即使平时不太编程的朋友,只要稍微花点时间研究一下就能写出功能不赖的脚本程序了。
这次想使用的服务器端脚本并非Vbscript而是Javascript,其实Javascript也是ASP所支持的脚本语言,只是,大家平时很少用在服务器端的开发,而更多的都使用在客户端的环境。
OK!关于Javascript的相关知识这里就不多阐述了,坛子里面多的很,自己去搜索一下吧。
现在进入正题,接触过Javascript的朋友都应该知道它是一种基于对象的脚本语言,虽然不象C++、Java那样真的正面向对象,但是也能模拟面向对象的思想。这里采用面向对象的方式来写,这样做的目的也是为了今后在维护上更加方面、代码逻辑更加清晰明了。
Step 1 建立一个sys_conf.asp文件,用来定义数据库环境变量的。代码如下:
<% //定义数据库环境变量 function sys_conf() { //数据库登陆帐号 this.dbuser = "jimmy"; //数据库登陆密码 this.dbpwd = "*******"; //数据库名称 this.dbname = "course"; //SQL SERVER服务器 this.dbhost = "(local)"; } %> 请注意,第一行
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%> 这一句一定要写上,因为ASP默认设置是VBSCRIPT。但是如果你在IIS中设置默认语言是#的话,那么也可以不写。建议大家还是写上比较好,接着就是一些数据库的环境变量了。
Step 2 建立class_database.asp的数据库类文件,代码如下:
<!--#Include file="sys_conf.asp"--> <% /*----------------------------------------------*/ //数据库类database //构造函数 //参数 : 无 /*----------------------------------------------*/ function database() { //建立数据库环境变量对象 //私有属性 var sys_conf_obj = new sys_conf(); var host = sys_conf_obj.dbhost; var user = sys_conf_obj.dbuser; var pwd = sys_conf_obj.dbpwd; var name = sys_conf_obj.dbname; //公共属性 this.conn = ""; this.rs = ""; //连接数据库 try { this.conn = Server.CreateObject("ADODB.CONNECTION"); this.conn.open("PROVIDER=SQLOLEDB.1;Data Source=" + host + ";Initial Catalog=" + name + ";Persist Security Info=True;User ID=" + user + ";Password=" + pwd + ";Connect Timeout=30"); if(this.conn.state == 1) { this.rs = Server.CreateObject("ADODB.RECORDSET"); this.rs.ActiveConnection = this.conn; } } catch(e) { this.conn = null; Response.Write ("The database connection makes a mistake, please inspect connects the string."); Response.End(); } } /*----------------------------------------------*/ //公共方法:create_rs() //作用 : 创建记录集对象 //返回值:无 /*----------------------------------------------*/ database.prototype.create_rs = function() { this.rs = Server.CreateObject("ADODB.RECORDSET"); this.rs.ActiveConnection = this.conn; } /*----------------------------------------------*/ //公共方法:close_rs() //作用 :释放记录集对象 //返回值:无 /*----------------------------------------------*/ database.prototype.close_rs = function() { this.rs.close(); this.rs = null; } /*----------------------------------------------*/ //公共方法:close_database() //参数 : 无 //作用 : 释放数据库连接对象 //返回值:无 /*----------------------------------------------*/ database.prototype.close_database = function() { this.conn.close(); this.conn = null; } /*----------------------------------------------*/ //公共方法:query() //参数 : sql - sql语句 max - 最大记录数 //作用 : 将记录集对象转换为二维数组 //返回值:记录集数组 /*----------------------------------------------*/ database.prototype.query = function(sql,max) { var i,j,fieldslen,len,vdata,data=[],sp; this.rs.Open(sql),this.conn,1,1; if(this.rs.EOF || this.rs.BOF) { this.close_rs(); return null; } else { vdata = this.rs.GetRows().toArray(); //获取数据表的字段数 fieldslen = this.rs.fields.count; this.close_rs(); //开始转换数组 //得到记录数 len = vdata.length/fieldslen; if(typeof(max) == "undefined") { //遍历所有记录 //i:记录号 j:字段号 for(i=0;i<len;i++) { data = new Array(); //指针指向下一条记录的首字段 sp = i * fieldslen; for(j=0;j<fieldslen;j++) data[j] = vdata[sp+j]; } }else{ //显示指定的记录数 for(i=0;i<max;i++) { if(i>=len) break; data = new Array(); //指针指向下一条记录的首字段 sp = i * fieldslen; for(j=0;j<fieldslen;j++) data[j] = vdata[sp+j]; } } return data; } } database.prototype.update = function(sql) { if(typeof(sql) == "undefined") { return; } else { this.conn.Execute(sql); } } %> 注意,这里采用的是记录集的GetRows()方法来得到一个数组,然后使用Javascript中的toArray()函数将它转换为一个#的数组。用GetRows()方法得到的数组是个二维数组,用VBSCRIPT很轻松就可以输出数组中的记录了,但是在JAVASCRPT中是没有二维数组的直接转换函数的,用toArray()转换的也只是一个一维数组,所以就要我们自己来将这个一维数组转换为二维数组了。
Step 3 建立一个view.asp来查看数据库中的记录。代码如下:
<!--#Include file="class_database.asp"--> <% var database_obj = new database();
database_obj.connection();
str_sql = "Select CourseID,CourseName,UpdateTime,CommDateTime,Comm,Hit From Course Order by UpdateTime Desc";
var tmp_arr = database_obj.query(str_sql); if(!tmp_arr) { Response.Write("no data..."); } else { // 循环输出数据 for(var y=0;y<tmp_arr.length;y++) {
// 注意,数组下标从0开始
// 显示数据库中数据
Response.Write("CourseID: "+tmp_arr[y][0]+", CourseName: "+tmp_arr[y][1] + ",UpdateTime: "+tmp_arr[y][2]);
} }
database_obj.close_database(); %> 这里的代码就很简单了。主要是调用class_database.asp中的query()方法得到真正的二维数组(也就是我们自己转换的二维数组),然后用循环逐一输出数据。
好了,到此处应该可以搞一段落了。总结一下思路,首先我们使用一个sys_conf()对象来定义数据库的环境变量,这样做的好处就是以后变量修改很方便。接着定义数据库类文件database(),其中封装了一些常规的方法,诸如,连接数据库、关闭数据库、建立记录集等。最重要的还是query()方法,它使用记录集的GetRows()方法将记录集返回一个Vbscript的二维数组,而后使用Javascript中的toArray()函数来转换成一个一维的数组,刚才说了,Javascript中是没有直接转换二维数组的函数,最后将它转换成我们需要的二维数组。当然如果你不习惯这种方法也可以使用常规的记录集的方法来逐一输出数据,这个主要是看个人的习惯了。
现在的问题是,如果数据库中的记录很多,象这样逐一输出数据肯定不可行,那么就得采取分页的形式了。关于这个我想放在下一次来说。以上的代码只是抛砖引玉,希望能够给大家得到一些编程上的启发,如果能这样的话,我已经很高兴了。由于个人水平有限,如果有哪些地方写得不妥,还请大家多多指正,在此谢过了!
上次我使用Javascript将记录集转换成数组,然后逐一输出数据。但是遗留下来一个问题就是如果数据库中的数据很多,那么最好的解决方案还是采取分页方式。注意了此处的分页和传统的记录集分页是有区别的。记住,这里是采用数组分页。下面创建一个分页类。
step 1 创建分页类文件class_data_grid.asp,代码如下:
<% /*----------------------------------------------*/ //分页类data_grid //参数 : pagesize - 每页显示最多记录数 rs_arr - 记录集数组 /*----------------------------------------------*/ function data_grid(pagesize,rs_arr) { //公共属性 this.pagesize = pagesize; this.rs_arr = rs_arr; this.start_pagecount = ""; this.end_pagecount = ""; //私有属性 var count = this.rs_arr.length; var page = 0; var flag = "";
/*----------------------------------------------*/ //公共方法:get_page() //参数 : 无 //作用 : 得到当前页并设置当前页 //返回值:无 /*----------------------------------------------*/ this.get_page = function() { if(is_empty(Request.QueryString("page")) || isNaN(Request.QueryString("page")) || Request.QueryString("page") == "" || parseInt(Request.QueryString("page"))<0) page = 0; else if(parseInt(Request.QueryString("page")) >= myint(count/this.pagesize)) page = myint(count/this.pagesize -1); else page = Request.QueryString("page"); } /*----------------------------------------------*/ //私有方法:is_empty() //参数 : 无 //作用 : 判断是否捕获到参数 //返回值:无 /*----------------------------------------------*/ var is_empty = function(obj) { return !(String(obj) != "" && String(obj) != "undefined"); } /*----------------------------------------------*/ //私有方法:myint() //参数 : 数值 //作用 : 得到整数 //返回值:整数 /*----------------------------------------------*/ var myint = function (avalue) { var rvalue; if (avalue > parseInt(avalue)) rvalue = parseInt(avalue) + 1; else rvalue = parseInt(avalue); return rvalue; } /*----------------------------------------------*/ //公共方法:set_pagecount() //参数:pagesize - 每页显示最多记录数 //作用:设置每页显示多少条记录 //flag = 1 是最后一页 //flag = 2 是第一页 //flag = 3 既是第一页,又是最后一页 //返回值:此页循环上限 /*----------------------------------------------*/ this.set_pagecount = function() { var n,s; this.start_pagecount = parseInt(page) * this.pagesize; //当到了这页的时候还剩余多少条记录 s = count - parseInt(page) * this.pagesize; //如何循环? if (parseInt(page) == 0 && s <= this.pagesize) { // 既是第一页,又是最后一页(也就是只有一页) flag = 3; n = count; } else if(parseInt(page) != 0 && s <= this.pagesize) { //最后一页 flag = 1; n = count; } else { //第一页 flag = 2; n = (parseInt(page)+1) * this.pagesize; } this.end_pagecount = n; } /*----------------------------------------------*/ //公共方法:show_pagelink() //参数 : page_name - 页面名称 para - 参数 //作用 : 显示分页 //返回值:无 /*----------------------------------------------*/ this.show_pagelink = function(page_name,para) { if (typeof(para) == "undefined") para = ""; Response.Write ("<ul>"); Response.Write("<li><font color=\"red\">" + (parseInt(page)+1) + "</font>/" + myint(count/this.pagesize) + " "); Response.Write ("每页" + this.pagesize + "条 "); Response.Write ("共<font color=\"red\">" + count + "</font>条记录 </li>"); //首页 if (flag != 3 && parseInt(page) != 0) Response.Write ("<li><a href=\"" +page_name + "?page=" + 0 + para + "\">首 页</a></li>"); else Response.Write ("<li class=\"cur\">首 页</li>"); //上一页 if (parseInt(page)>0) Response.Write ("<li><a href=\"" + page_name + "?page=" + (parseInt(page)-1) + para + "\">上一页</a></li>"); else Response.Write ("<li class=\"cur\">上一页</li>"); /*var begin_page = 0; var end_page = myint(count/this.pagesize); if(end_page >= 8) { if(parseInt(page) >= 5) { begin_page = parseInt(page) - 4; if (parseInt(page) <= (end_page - 4)) { end_page = parseInt(page) + 4; }else{ end_page = end_page; begin_page = end_page - 4; } }else{ begin_page = 0; end_page = 8; } } var str_page = ""; for(var i=begin_page;i<end_page;i++) { if(i == parseInt(page)) { str_page += " <li class=\"cur\">["; str_page += (i+1); str_page += "]</li> "; }else{ str_page += " <a href=\"" + page_name + "?page=" str_page += i; str_page += para; str_page += "\" class=\"page\">["; str_page += (i+1); str_page += "]</a>"; } } Response.Write(str_page);*/ //下一页 if (flag ==2) Response.Write ("<li><a href=' " + page_name + "?page=" + (parseInt(page)+1) + para + " ' >下一页</a></li>"); else Response.Write ("<li class=\"cur\">下一页</li>"); //末页 if (flag != 1 && flag != 3) Response.Write ("<li><a href=\"" + page_name + "?page=" + myint((count+1)/this.pagesize -1) +para + "\">末 页</a></li>"); else Response.Write ("<li class=\"cur\">末 页</li>"); var str_form = ""; str_form += "<li><form method=\"post\" onsubmit=\"document.location = ' "; str_form += page_name; str_form += "?page='+(page.value-1)+'"; str_form += para; str_form += "';return false;\">"; str_form += "跳转到 <input type=\"text\" name=\"page\" size=\"2\" value=\""; str_form += (parseInt(page)+1); str_form += "\" /> 页</form></li>"; Response.Write(str_form); Response.Write ("</ul>"); } } %> 以上都有注释,相信有一定基础的朋友都能够读懂代码。
step 2 有了分页类,使用起来就简单多了。修改上次的view.asp文件,代码如下:
<!--#Include file="class_database.asp"--> <!--#Include file="class_data_grid.asp"--> <% var database_obj = new database(); //数据库连接 database_obj.connection(); str_sql = "Select CourseID,CourseName,UpdateTime,CommDateTime,Comm,Hit From Course Order by UpdateTime Desc"; var tmp_arr = database_obj.query(str_sql); var data_grid_obj = new data_grid(10,tmp_arr); data_grid_obj.get_page(); data_grid_obj.set_pagecount(); for(var y=data_grid_obj.start_pagecount;y<data_grid_obj.end_pagecount;y++) { Response.Write("CourseID: "+tmp_arr[y][0]+", CourseName: "+tmp_arr[y][1]+ ",UpdateTime: "+tmp_arr[y][2]+"<br />"); } para = "&keyword=aaa"; data_grid_obj.show_pagelink("view.asp",para); database_obj.close_database(); %> OK!全部完成了。这样页面代码逻辑思路清晰,也不会有其他乱七八糟的冗余代码了。
以上就是使用Javascript服务器端脚本来实现数据库操作,希望对大家有所帮助,由于时间仓促,可能会有地方还需改进。在此基础上自己还可以加一些其他的方法,比如数据的增、删、改等等,操作数据库同样很方便。本例采用的思路是面向对象,这样也符合代码规范,其实大家如果了解PHP的面向对象的编程思路,应该一看就知道它和PHP的面向对象编程思路实际上是完全一致的。 |