关键词:ASP
如何处理ASP中的图象(ORACLE数据库)
在用ASP编程中,很多时侯要用到图象。对于单纯从数据库中处理一个图象,可以看下面的代码:
这里假设你有个数据库名字叫:orasql,在数据库中有一个叫:POPULATION_PHOTO的数据表,
在表中有一个RESI_PHOTO 的BLOB列。我们查出RESI_ID=370101的人的相片。
ODBC链接:
1、控制面板中,打开ODBC 数据源,选择系统DSN ,单击“添加”;
2、选择 Microsoft ODBC for Oracle [不要选择Oracle ODBC Driver] 命名为"orasql";
3、登陆用户名为 ws (密码为sql,oracle 中定义)并输入数据库所在服务器名.
4、测试数据库链接,接通即可。
FILE: PHOTO.ASP
***************************************
<%@ LANGUAGE="VBSCRIPT" %>
<%
' Clear out the existing HTTP header information
Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
' Change the HTTP header to reflect that an image is being passed.
Response.ContentType = "image/gif"
Set cn = Server.CreateObject("ADODB.Connection")
' The following open line assumes you have set up a System DataSource
cn.Open "orasql","ws","SQL"
Set rs = cn.Execute("SELECT PHOTO FROM POPULATION_PHOTO WHERE RESI_ID='370101'")
Response.BinaryWrite rs("logo")
Response.End
%>
*****************************************
执行这个ASP文件,在IE 或 NetScape 中就可以看到你存在数据库中的照片了。
但如果是同时处理文字和图象,或在一个页面中显示多个人员照片就会有些困难了。
比如:一个网域的人员管理,后台数据库可以用SYBASE、ORACLE或SQL SERVER等。(我在这用ORACLE)当你在企业内部需要用到BROWSE/SERVER方式,即用浏览器查看员工的个人信息时,就即要处理文字信息同时还要用到关于图象的技巧,极有可能查询到同名或同姓人员的信息,这就需要在一个页面中显示多个图片。
假如查询出的同姓人员太多,就需要作分页功能。
问题在于你显示文字信息时HTML的HEAD中的CONTENT=“TEXT/HTML”,而显示图象则必须是CONTENT=“IMAGE/GIF”或者是CONTENT=”IMAGE/JPEG“。因此你是无法只用一个ASP文件就把文字信息和图象都处理完的,解决的办法是:用一个单独的ASP文件处理一个图象,然后在处理文字信息的ASP文件中调用这个ASP文件。
在这给大家介绍一个我的解决方法,希望大家一起讨论:
环境:WINNT4.0 ORACLE FOR NT(unix) IIS3.0
数据库名:ORASQL
表名:POPULATION 经主键RESI_ID 链接 POPULATION_PHOTO
目的:从POPULATION中查出未定姓名的人员的信息(自由查询),包括姓名(resi_name),性别(resi_sex),
身份证号(resi_identity) ;从POPULATION_PHOTO中查出相应人员照片(RESI_PHOTO)。链接键(RESI_ID )
功能:在此我们可查询出所有某姓(例如”李“姓)的人员信息带照片(可以是符合某查询条件的多条信息),每页限显示 5人信息,自动分页;亦可按身份证号码精确查询。
第一步:创建一个查询表单QUERY.HTM:
**********************************
<html>
<head>
</head>
<body>
<form method="POST" action="ORAQUERY.ASP">
<p>请输入姓名:<input type="text" name="name" size="20"></p>
<p> 身份证号:<input type="text" name="id" size="23"></p>
<p><input type="submit" value="查 询" name="B1"><input type="reset" value="清 除" name="B2"></p>
</form>
</body>
</html>
***********************************
第二步:建立ORAQUERY.ASP
***********************************
<!-- #INCLUDE VIRTUAL="/adovbs.inc" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>查询显示</title>
</head>
<body bgColor="Azure">
<%
DIM ls_sql
NAME=Request.Form("name")
ID=Request.Form("id")
if (name<>"") then
ls_sql="SELECT * FROM population WHERE resi_name LIKE '" & name &"%'"
IF (id<>"") THEN
ls_sql=ls_sql &" and resi_identity='"
ls_sql=ls_sql & id &"'"
END IF
else
IF (id<>"") THEN
ls_sql="SELECT * FROM population WHERE resi_identity='" & id &"'"
END IF
end if
DIM CurrentPage,rowcount,li_i
function CHECKNULL(data)
IF ISNULL(DATA) THEN
RESPONSE.WRITE ("--")
ELSE
RESPONSE.WRITE DATA
END IF
end function
CurrentPage=TRIM(Request("CurrentPage"))
if CurrentPage="" then CurrentPage = 1
set conn=server.CreateObject("ADODB.Connection")
conn.open "orasql","ws","sql"
Set rs=Server.CreateObject("ADODB.Recordset")
rs.cursorType=adOpenStatic
rs.PageSize=5
rs.Open ls_sql,conn
%>
’just for aesthetic feeling ,may link some picture bar.gif
<p align="left"><img src="image/bar.gif" alt="bar.gif (7089 bytes)" WIDTH="409"
HEIGHT="63"></p>
<p align="center"><font color="#0000FF" face="楷体_GB2312"><big><big>查 询</big></big></font></p>
<%
nobody="对不起!数据库里没有您要找的人员资料!"%>
<%IF rs.eof THEN %>
<p><br></p>
<p align="center"><font size="5" color="OrangeRed"><%Response.Write(nobody)%><% response.write ls_sql%> </font></p>
<%else
DIM li,IDNO
DIM ls_file,ls_filetrue
li=0
rs.AbsolutePage=Cint(CurrentPage)
rowcount=0
while NOT rs.eof AND rowCount<rs.PageSize
li = li+1
ls_file="showing"
ls_filetrue=""
IDNO=rs.Fields("resi_id").value
%>
<div align="center"><div align="center"><center>
<table border="1" width="528" height="134">
<tr>
<td width="110" height="40" align="center">姓名</td>
<td width="288" height="40"><%
CHECKNULL(rs("resi_name"))
Set RsPHOTO = conn.Execute("SELECT RESI_PHOTO FROM population_photo WHERE resi_id='"&IDNO&"'")
%></td>
<td width="112" height="135" rowspan="3"><%
if NOT RsPHOTO.eof then
Session(LI)=rsPHOTO("resi_photo")
ls_filetrue=ls_file+Cstr(li)+".asp"
%><img src="<%=ls_filetrue%>" alt="照片">
<%
else
RESPONSE.WRITE " 无照片"
end if%> </td>
</tr>
<tr>
<td width="110" height="40" align="center">性别</td>
<td width="288" height="40"><%
CHECKNULL(rs("resi_sex"))%></td>
</tr>
<tr>
<td width="110" height="40" align="center">身份证号</td>
<td width="288" height="40"><%
CHECKNULL(rs("resi_identity"))
%></td>
</tr>
</table>
</center></div><%response.write "<br>第 ( "&li&" ) 条纪录<br>" %>
<br>
<%
rowCount=rowCount+1
rs.MoveNext
WEND
%>
<%
response.write "<p align=""left"">第 [ "&CurrentPage&" ] 页</p>"
response.write"<hr><br>"
for li_i=1 to rs.PageCount%>
<a href="xbmquery1.asp?CurrentPage=<%=li_i%>"><font face="Impact">( <%=li_i%> )</font></a>
<% next%>
</div>
<%rs.close
set rs=nothing
rsphoto.close
set rsphoto=nothing
conn.close
set conn=nothing
END IF
%>
<p> </p>
<p align="center">
<applet code="fphover.class" codebase="_fpclass" width="120" height="24">
<param name="text" value="重置查询">
<param name="color" value="#008000">
<param name="hovercolor" value="#0000FF">
<param name="textcolor" value="#FFFFFF">
<param name="bgcolor" value="#FFFFFF">
<param name="effect" value="glow">
<param name="url" value="query.asp" valuetype="ref">
<param name="font" value="Dialog">
<param name="fontstyle" value="regular">
<param name="fontsize" value="14">
</applet>
</p>
</body>
</html>
***********************************
第三步:建立处理图象的ASP文件(SHOWING1.ASP)。第一页中每幅照片需要一个文件。以后各页会自动循环使用第一页照片文件。(SHOWING1.ASP)用来显示每页中第一幅照片。
***********************************
<%@ LANGUAGE="VBSCRIPT" %>
<%
Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
resi_photo=session.Contents(1)
' Get picture
Response.ContentType = "image/gif"
Response.BinaryWrite resi_photo
Response.End
%>
**********************************
注:1、附若要在一页中显示人员信息条数较少,(如少于5 幅)可复制(SHOWING1.ASP) 5 遍,分别定义为 (SHOWING2.ASP)(SHOWING3.ASP)(SHOWING4.ASP)(SHOWING5.ASP)。每个文件中resi_photo=session.Contents(li)语句,相应 li 修改为第 li 幅照片。亦可把(ORAQUERY.ASP)中li_flag = li+1 变量定义为Session(li_flag)则 (SHOWING<1--5>.ASP)文件内容完全相同,均接收Session(li_flag)变量.
2、若一页中显示人员信息条数太多,可把下面语句加入 (ORAQUERY.ASP) 循环显示语句中(调照片前),动态创建showing.asp 文件,每次显示照片前便产生相应文件,然后在退出时,删除这些文件(fso.DeleteFile "C:\path\showing*.asp")。
动态创建showing.asp 文件语句:
‘ set showing.asp path
xmlPath = "C:\web\showing"&li&".asp"
set fso = server.createobject("scripting.filesystemobject")
set f = fso.createTextFile(xmlPath,true)
f.writeline "<% Response.Expires = 0"
f.writeline " Response.Buffer = TRUE "
f.writeline " Response.Clear"
f.writeline "resi_photo=session.Contents("&li_flag&")"
f.writeline "Response.ContentType = ""image/gif"""
f.writeline "Response.BinaryWrite resi_photo"
f.writeline "Response.End"
f.writeline "%"&">"
f.writeline "<head><title></title>"
f.writeline "</head><body></body>"
f.writeline "</html>"
set f = nothing
set fso = nothing
这里主要就是用到了一个小技巧就是利用了一个SESSION变量来实现查询出的photo 传递。
避免重复连接数据库。大家对应上述只需少量改动,就可实现一个页面既有文字又有图象多条查询了!
|