如何用ASP代碼實現(xiàn)虛擬主機
- 來源:縱橫數(shù)據
- 作者:中橫科技
- 時間:2013/1/31 16:31:56
- 類別:新聞資訊
在虛擬主機的環(huán)境下,因為沒有管理員權限,只有數(shù)據庫使用權限,定時備份SQL數(shù)據是
個比較麻煩的問題。解決思路如下:(僅對SQL2000有效)
1. 利用T-SQL備份數(shù)據庫到指定目錄,文件名根據日期指定。
2. 利用Resin的定時功能,定時執(zhí)行備份。
3. 用戶定時下載備份并且刪除過期備份。
導出全部數(shù)據到Excel也比較實用。下面提供的方法可以導出庫中的全部表,也可以指定
幾個表導出。注意:
1. 因為是導出全部數(shù)據,在數(shù)據比較多的情況下慎用。
2. 理論上應該適用各種JDBC數(shù)據庫,僅對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: 數(shù)據庫備份</p>
* <p>Description: 在Java中備份數(shù)據庫</p>
* @author steeven
* @version 1.0
*/
public class DBackup{
Context ctx ;
public DBackup(Context ctx) {
this.ctx = ctx;
}
/**
* 備份SQL2000數(shù)據庫到文件,整個數(shù)據庫備份
* 文件名后面將追加備份年月日。例如: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);
}
/**
* 導出整個數(shù)據庫到Excel
* @param conn 數(shù)據庫連接
* @param out 輸出Stream
*/
public static void db2Excel(Connection conn,OutputStream out)throws
Exception{
db2Excel(conn,out,getTables(conn));
}
/**
* 導出數(shù)據庫中指定的表名到Excel
* @param conn 數(shù)據庫連接
* @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();
}
/**
* 導出表數(shù)據到Excel的sheet
*/
public static void writeSheet(
WritableSheet sheet,String table,Connection conn)
throws Exception
{
//取得所有表數(shù)據
String sql = "select * from "+DB.ESC1+table+DB.ESC2;
ResultSet rs = conn.createStatement().executeQuery(sql);
//根據ResultSet的MetaData取得表頭,列數(shù),列寬
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取得所有數(shù)據表的名稱
*/
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();
個比較麻煩的問題。解決思路如下:(僅對SQL2000有效)
1. 利用T-SQL備份數(shù)據庫到指定目錄,文件名根據日期指定。
2. 利用Resin的定時功能,定時執(zhí)行備份。
3. 用戶定時下載備份并且刪除過期備份。
導出全部數(shù)據到Excel也比較實用。下面提供的方法可以導出庫中的全部表,也可以指定
幾個表導出。注意:
1. 因為是導出全部數(shù)據,在數(shù)據比較多的情況下慎用。
2. 理論上應該適用各種JDBC數(shù)據庫,僅對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: 數(shù)據庫備份</p>
* <p>Description: 在Java中備份數(shù)據庫</p>
* @author steeven
* @version 1.0
*/
public class DBackup{
Context ctx ;
public DBackup(Context ctx) {
this.ctx = ctx;
}
/**
* 備份SQL2000數(shù)據庫到文件,整個數(shù)據庫備份
* 文件名后面將追加備份年月日。例如: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);
}
/**
* 導出整個數(shù)據庫到Excel
* @param conn 數(shù)據庫連接
* @param out 輸出Stream
*/
public static void db2Excel(Connection conn,OutputStream out)throws
Exception{
db2Excel(conn,out,getTables(conn));
}
/**
* 導出數(shù)據庫中指定的表名到Excel
* @param conn 數(shù)據庫連接
* @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();
}
/**
* 導出表數(shù)據到Excel的sheet
*/
public static void writeSheet(
WritableSheet sheet,String table,Connection conn)
throws Exception
{
//取得所有表數(shù)據
String sql = "select * from "+DB.ESC1+table+DB.ESC2;
ResultSet rs = conn.createStatement().executeQuery(sql);
//根據ResultSet的MetaData取得表頭,列數(shù),列寬
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取得所有數(shù)據表的名稱
*/
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();