怎么样在虚拟主机环境下备份数据库并且导出到EXCEL?
在虚拟主机的环境下,因为没有管理员权限,只有数据库使用权限,定时备份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/package steeven;
import jxl.write.*; import java.util.*; import java.sql.Statement; import java.sql.ResultSet; import java.sql.Types; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.DateFormat; import java.io.*;/**
* <p>Title: 数据库备份</p> * <p>Description: 在Java中备份数据库</p> * @author steeven * @version 1.0 */ public class DBackup{ Context ctx ; public DBackup(Context ctx) { this.ctx = ctx; } /** * 备份SQL2000数据库到文件,整个数据库备份 * 文件名后面将追加备份年月日。例如:c:/dbBackup/mydb031109 * @param file 导出的文件名全路径。例如:"c://dbBackup//mydb" */ public void backup(String dbName, String file)throws SQLException{ String sql = "BACKUP DATABASE ["+dbName+"] TO DISK = N'"; sql += file + new SimpleDateFormat("yyMMdd").format(new Date()); sql += "' WITH NOINIT , NOUNLOAD , NAME = N'lvdong', NOSKIP ,STATS = 10, NOFORMAT";
Statement stmt = ctx.getConnection().createStatement(); stmt.executeUpdate(sql); } /** * 导出整个数据库到Excel * @param conn 数据库连接 * @param out 输出Stream */ public static void db2Excel(Connection conn,OutputStream out)throwsException{
db2Excel(conn,out,getTables(conn)); } /** * 导出数据库中指定的表名到Excel * @param conn 数据库连接 * @param out 输出Stream * @param tables 表名 * @throws Exception */ public static void db2Excel(Connection conn,OutputStream out,Listtables)throws Exception{
WritableWorkbook wb = jxl.Workbook.createWorkbook(out); for (int i = 0; i < tables.size(); i++) { WritableSheet sheet = wb.createSheet(tables.get(i).toString(),i); writeSheet(sheet,tables.get(i).toString(),conn); } wb.write(); wb.close(); } /** * 导出表数据到Excel的sheet */ public static void writeSheet( WritableSheet sheet,String table,Connection conn) throws Exception { //取得所有表数据 String sql = "select * from "+DB.ESC1+table+DB.ESC2; ResultSet rs = conn.createStatement().executeQuery(sql); //根据ResultSet的MetaData取得表头,列数,列宽 java.sql.ResultSetMetaData meta = rs.getMetaData(); int n = meta.getColumnCount(); int row = 0; WritableCellFormat fmt = new WritableCellFormat(); fmt.setBackground(jxl.format.Colour.YELLOW); for (int i = 0; i < n; i++){ //导出表头 sheet.addCell(new Label(i, row, meta.getColumnLabel(i + 1),fmt)); //设定列宽 // sheet.setColumnView(i,meta.getColumnDisplaySize(i+1)); } row++; while(rs.next()){ for (int i = 0; i < n; i++){ //根据列的类型决定Excel中对应的Cell类型,缺省为文本。 WritableCell cell ; switch(meta.getColumnType(i+1)){ case Types.BIT: case Types.BIGINT: case Types.BOOLEAN: case Types.DECIMAL: case Types.FLOAT: case Types.INTEGER: case Types.NUMERIC: case Types.REAL: case Types.SMALLINT: case Types.TINYINT: double val = rs.getDouble(i+1); if (rs.wasNull()) cell = new jxl.write.Blank(i,row); cell = new jxl.write.Number(i, row, val); break; case Types.DATE: case Types.TIME: case Types.TIMESTAMP: Date date = rs.getDate(i + 1); if (rs.wasNull()) cell = new jxl.write.Blank(i,row); else cell = new jxl.write.DateTime(i, row, date); break; default: cell = new Label(i, row, rs.getString(i + 1)); } //end of switch sheet.addCell(cell); }//end of for each column row++; }//end of while(rs.next()) } /** * 从Connection的MetaData取得所有数据表的名称 */ public static List getTables(Connection conn)throws Exception{ ResultSet rs = conn.getMetaData().getTables( null,null,null,new String[]{"Table"}); List list = new ArrayList(); while(rs.next()) list.add(rs.getString(3)); rs.close(); return list; }public static void main(String[] args) throws Exception{
Connection conn = DB.getConn(); FileOutputStream out = new FileOutputStream("c://test.xls"); db2Excel(conn,out); out.close(); conn.close(); } }