分享
 
 
 

在虚拟主机环境下备份数据库并且导出到EXCEL

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在虚拟主机的环境下,因为没有管理员权限,只有数据库使用权限,定时备份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)throws

Exception{

db2Excel(conn,out,getTables(conn));

}

/**

* 导出数据库中指定的表名到Excel

* @param conn 数据库连接

* @param out 输出Stream

* @param tables 表名

* @throws Exception

*/

public static void db2Excel(Connection conn,OutputStream out,List

tables)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();

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有