在虚拟主机的环境下,因为没有管理员权限,只有数据库使用权限,定时备份SQL数据是
个比较麻烦的问题。解决思路如下:(仅对SQL2000有效)
1.利用T-SQL备份数据库到指定目录,文件名根据日期指定。
2.利用Resin的定时功能,定时执行备份。
3.用户定时下载备份并且删除过期备份。
导出全部数据到Excel也比较实用。下面提供的方法可以导出库中的全部表,也可以指定
几个表导出。注意:
1.因为是导出全部数据,在数据比较多的情况下慎用。
2.理论上应该适用各种JDBC数据库,仅对SQL2000测试过
3.对于B/S下载,建议不要在服务器上生成文件,以免造成垃圾文件。直接从HTTP的Response中取得OutputStream进行输出。
4.Excel操作的API请到这里下载:http://www.andykhan.com/jexcelapi/
packagesteeven;
importjxl.write.*;
importjava.util.*;
importjava.sql.Statement;
importjava.sql.ResultSet;
importjava.sql.Types;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
importjava.text.DateFormat;
importjava.io.*;
/**
*<p>Title:数据库备份</p>
*<p>Description:在Java中备份数据库</p>
*@authorsteeven
*@version1.0
*/
publicclassDBackup{
Contextctx;
publicDBackup(Contextctx){
this.ctx=ctx;
}
/**
*备份SQL2000数据库到文件,整个数据库备份
*文件名后面将追加备份年月日。例如:c:\dbBackup\mydb031109
*@paramfile导出的文件名全路径。例如:"c:\\dbBackup\\mydb"
*/
publicvoidbackup(StringdbName,Stringfile)throwsSQLException{
Stringsql="BACKUPDATABASE["+dbName+"]TODISK=N’";
sql+=file+newSimpleDateFormat("yyMMdd").format(newDate());
sql+="’WITHNOINIT,NOUNLOAD,NAME=N’lvdong’,NOSKIP,
STATS=10,NOFORMAT";
Statementstmt=ctx.getConnection().createStatement();
stmt.executeUpdate(sql);
}
/**
*导出整个数据库到Excel
*@paramconn数据库连接
*@paramout输出Stream
*/
publicstaticvoiddb2Excel(Connectionconn,OutputStreamout)throws
Exception{
db2Excel(conn,out,getTables(conn));
}
/**
*导出数据库中指定的表名到Excel
*@paramconn数据库连接
*@paramout输出Stream
*@paramtables表名
*@throwsException
*/
publicstaticvoiddb2Excel(Connectionconn,OutputStreamout,List
tables)throwsException{
WritableWorkbookwb=jxl.Workbook.createWorkbook(out);
for(inti=0;i<tables.size();i++){
WritableSheetsheet=wb.createSheet(tables.get(i).toString(),i);
writeSheet(sheet,tables.get(i).toString(),conn);
}
wb.write();
wb.close();
}
/**
*导出表数据到Excel的sheet
*/
publicstaticvoidwriteSheet(
WritableSheetsheet,Stringtable,Connectionconn)
throwsException
{
//取得所有表数据
Stringsql="select*from"+DB.ESC1+table+DB.ESC2;
ResultSetrs=conn.createStatement().executeQuery(sql);
//根据ResultSet的MetaData取得表头,列数,列宽
java.sql.ResultSetMetaDatameta=rs.getMetaData();
intn=meta.getColumnCount();
introw=0;
WritableCellFormatfmt=newWritableCellFormat();
fmt.setBackground(jxl.format.Colour.YELLOW);
for(inti=0;i<n;i++){
//导出表头
sheet.addCell(newLabel(i,row,meta.getColumnLabel(i+1),fmt));
//设定列宽
//sheet.setColumnView(i,meta.getColumnDisplaySize(i+1));
}
row++;
while(rs.next()){
for(inti=0;i<n;i++){
//根据列的类型决定Excel中对应的Cell类型,缺省为文本。
WritableCellcell;
switch(meta.getColumnType(i+1)){
caseTypes.BIT:
caseTypes.BIGINT:
caseTypes.BOOLEAN:
caseTypes.DECIMAL:
caseTypes.FLOAT:
caseTypes.INTEGER:
caseTypes.NUMERIC:
caseTypes.REAL:
caseTypes.SMALLINT:
caseTypes.TINYINT:
doubleval=rs.getDouble(i+1);
if(rs.wasNull())cell=newjxl.write.Blank(i,row);
cell=newjxl.write.Number(i,row,val);
break;
caseTypes.DATE:
caseTypes.TIME:
caseTypes.TIMESTAMP:
Datedate=rs.getDate(i+1);
if(rs.wasNull())cell=newjxl.write.Blank(i,row);
elsecell=newjxl.write.DateTime(i,row,date);
break;
default:
cell=newLabel(i,row,rs.getString(i+1));
}//endofswitch
sheet.addCell(cell);
}//endofforeachcolumn
row++;
}//endofwhile(rs.next())
}
/**
*从Connection的MetaData取得所有数据表的名称
*/
publicstaticListgetTables(Connectionconn)throwsException{
ResultSetrs=conn.getMetaData().getTables(
null,null,null,newString[]{"Table"});
Listlist=newArrayList();
while(rs.next())
list.add(rs.getString(3));
rs.close();
returnlist;
}
publicstaticvoidmain(String[]args)throwsException{
Connectionconn=DB.getConn();
FileOutputStreamout=newFileOutputStream("c:\\test.xls");
db2Excel(conn,out);
out.close();
conn.close();
当前名称:如何用ASP代码实现虚拟主机
浏览地址:
http://mswzjz.cn/article/pcih.html