在進行ASP網站開發時,有時需在客戶端調用MSSQL數據庫的數據進行打印,若調用數據量小,可以通過在客戶端運用FileSystemObject生成文件對象的方法實現打印,這裡不再贅述。若需調用大量數據,可在客戶端腳本中實例化RDS.DataSpace(Remote Data Service)對象,並採用遠程提供程序通過ASP網站訪問MSSQL數據庫(設置成只能通過RDS Default Handler或自定義商業對象才能訪問數據庫,可保證數據庫的安全),再在客戶端實例化EXCEL.APPLICATION對象,把數據集中的數據寫入EXCEL中,再進行保存或打印。代碼如下:
<html> <head> <META content=text/html; charset=gb2312 http-equiv=Content-Type> <title>客戶端電子表格打印</title> </head> <body bgColor=skyblue topMargin=5 leftMargin=20 oncontextmenu=return false rightMargin=0 bottomMargin=0> <div align=center><center> <table border=1 bgcolor=#ffe4b5 style=HEIGHT: 1px; TOP: 0px bordercolor=#0000ff> <tr> <td align=middle bgcolor=#ffffff bordercolor=#000080> <font color=#000080 size=3> 客戶端電子表格打印 </font> </td> </tr> </table> </div> <form name=myform> <DIV align=left> <input type=button value=Excel Report name=report language=vbscript onclick=fun_excel() style=HEIGHT: 32px; WIDTH: 90px> </div> </form> </body> </html> <script language=vbscript> sub fun_excel() Dim rds,rs,df dim strCn,strSQL,StrRs Dim xlApp, xlBook, xlSheet1 set rds = CreateObject(RDS.DataSpace) Set df = rds.CreateObject(RDSServer.DataFactory,http://192.168.0.1) '192.168.0.1 為WEB服務器IP地址 strcn=provider=ms remote;remote server=http://192.168.0.1;handler=msdfmap.handler;data source=pubsdatabase; '192.168.0.1 為WEB服務器IP地址 strsql= getalljobs Set rs = df.Query(strCn, strSQL) Set xlApp = CreateObject(EXCEL.APPLICATION) '注意不是:Server.CreateObject(EXCEL.APPLICATION) Set xlBook = xlApp.Workbooks.Add Set xlSheet1 = xlBook.Worksheets(1) xlSheet1.cells(1,1).value =職務表 xlSheet1.range(A1:D1).merge xlSheet1.cells(2,1).value = job_id xlSheet1.cells(2,2).value = job_desc xlSheet1.cells(2,3).value = max_lvl xlSheet1.cells(2,4).value = min_lvl cnt =3 do while not rs.eof xlSheet1.cells(cnt,1).value = rs(job_id) xlSheet1.cells(cnt,2).value = rs(job_desc) xlSheet1.cells(cnt,3).value = rs(max_lvl) xlSheet1.cells(cnt,4).value = rs(min_lvl) rs.movenext cnt = cint(cnt) + 1 loop xlSheet1.Application.Visible = True end sub </script> |
也可以實例化RDS DataControl,只需把以上部分代碼進行修改:
set rds = CreateObject(RDS.DataSpace) Set df = rds.CreateObject(RDSServer.DataFactory,http://192.168.0.1) '192.168.0.1 為WEB服務器IP地址 strcn=provider=ms remote;remote server=http://192.168.0.1;handler=msdfmap.handler;data source=pubsdatabase; '192.168.0.1 為WEB服務器IP地址 strsql= getalljobs Set rs = df.Query(strCn, strSQL) |
修改為:
set DC = createobject(RDS.DataControl) dc.ExecuteOptions =1 '設置成同步執行,可以簡化下步代碼 dc.FetchOptions = 1 With dc .Server = http://192.168.0.1 .Handler = MSDFMAP.Handler .Connect = Data Source=pubsdatabase; .Sql = getalljobs .Refresh End With set rs= dc.Recordset |
修改文件MSDFMAP.INI(若在WIN98,C:/windows/msdfmap.ini;若在WIN2000,D:/winnt/msdfmap.ini;若在WIN2000 SERVER,D:/winnts/msdfmap.ini)。
[sql getalljobs] Sql=SELECT * FROM jobs [connect pubsDatabase] Access=Readonly Connect=provider=sqloledb;data source=sql server;initial catalog=pubs;UID=userid;PWD=password |
打開註冊表HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/W3SVC/Parameters/ADCLaunch 若無RDSServer.Datafactory,請添加。本例使用RDS Default Handler訪問數據庫,若不通過RDS Handler訪問數據庫,修改註冊表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/DataFactory/ HandlerInfo 將HandlerRequired=1 設置成HandlerRequired =0。請注意,若不通過RDS Handler或自定義商業對象訪問數據庫,將對數據庫帶來安全隱患,所以作者極力推薦採用只能通過RDS Handler或自定義商業對象才能訪問數據庫的方式。
下面用VB編寫一個自定義商業對象,代碼如下:
'編寫ActiveX DLL,名稱:rsget.dll,包含類rsreturn,方法returnrs Public Function ReturnRs(strDB As Variant, strSQL As Variant) As ADODB.Recordset 'Returns an ADODB recordset. On Error GoTo ehGetRecordset Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Select Case strDB Case ydjjspdatabase strDB = ydjjsp Case pubsdatabase strDB = pubs End Select If strSQL = getallbuy Then strSQL = select * from buyuser GoTo nextstep End If If Left(strSQL, InStr(strSQL, () - 1) = getpubsbyid Then If InStr(strSQL, ,) <= 0 Then Dim str As String str = Mid(strSQL, InStr(strSQL, () + 2, InStr(strSQL, )) - InStr(strSQL, () - 3) strSQL = select * from jobs where job_id=' & str & ' Else Dim strstart, strend As String strstart = Mid(strSQL, InStr(strSQL, () + 2, InStr(strSQL, ,) - InStr(strSQL, () - 3) strend = Mid(strSQL, InStr(strSQL, ,) + 2, InStr(strSQL, )) - InStr(strSQL, ,) - 3) strSQL = select * from jobs where job_id>=' & strstart & ' and job_id<=' & strend & ' End If End If nextstep: Dim strConnect As String strConnect = Provider=SQLOLEDB;Server=ddk;uid=ydj;pwd=ydj; Database= & strDB & ; cn.Open strConnect rs.CursorLocation = adUseClient rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText Set ReturnRs = rs Exit Function ehGetRecordset: Err.Raise Err.Number, Err.Source, Err.Description End Function |
把rsget.dll複製到C:/WINDOWS或D:/WINNT,開始/運行,輸入Regsvr32.exe c:/windows/rsget.dll或Regsvr32.exe d:/winnt/rsget.dll,按確定按鈕,註冊成WEB服務器組件,並在註冊表HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/W3SVC/Parameters/ADCLaunch 添加rsget.rsreturn。
若使用自定義商業對象,修改上面的ASP文件代碼:
set rds = CreateObject(RDS.DataSpace) Set df = rds.CreateObject(RDSServer.DataFactory,http://192.168.0.1) '192.168.0.1 為WEB服務器IP地址 strcn=provider=ms remote;remote server=http://192.168.0.1;handler=msdfmap.handler;data source=pubsdatabase; '192.168.0.1 為WEB服務器IP地址 strsql= getalljobs Set rs = df.Query(strCn, strSQL) |
改為:
set rds = CreateObject(RDS.DataSpace) Set df = rds.CreateObject(rsget.rsreturn,http://192.168.0.1) set rs=df.returnrs(pubsdatabase,getpubsbyid('2','10')) |
另外在瀏覽器端需做如下配置:
打開控制面板->INTERNET選項->安全性->自定義級別-> 對沒有標記為安全的ActiveX控件進行初始化和腳本運行->開啟