请大家帮忙解决
谢谢
分数我可以在加
14 个解决方案
#1
windows和sql server身份验证,这样子是可以的
bcp "mydb..mytable " out "d:\outtable.txt" -c -U"sa" -P"pass"
bcp "mydb..mytable " out "d:\outtable.txt" -c -U"sa" -P"pass"
#2
在SQLSERVER2000中的备份只能对整个库进行操作,生成备份文件。
至于单个表的备份可用导入导出操作来完成,此项操作在企业管理器中选择单个表按右键就能找到,导入(还原)导出(备份)操作有向导程序。
用命令导入导出如yingyys所写,具体参数可参照SQLSERVER帮助。
至于单个表的备份可用导入导出操作来完成,此项操作在企业管理器中选择单个表按右键就能找到,导入(还原)导出(备份)操作有向导程序。
用命令导入导出如yingyys所写,具体参数可参照SQLSERVER帮助。
#3
用个SQL语句是可以的,你用一个ADOQuery控件,然后设置它的SQL语名为以下:
DUMP TABLE 数据库中的表名 TO 你要备份的表名 WITH STATS
然后ExecSQL就可以备份你的数据库表啦。
DUMP TABLE 数据库中的表名 TO 你要备份的表名 WITH STATS
然后ExecSQL就可以备份你的数据库表啦。
#4
void __fastcall TfrmClearData::BackupDatabase(void)
{
String dir,deleteDir;
ffblk ffblk;
dir = ExtractFilePath(ParamStr(0)) + "\\DataBaseBuckup\\";
if(!DirectoryExists(dir)){
CreateDir(dir);
}
BackupTable("tb_TranProcess",dir);
BackupTable("tb_PresentTranProcess",dir);
BackupTable("tb_CumulateDot",dir);
BackupTable("tb_ForwardDot",dir);
}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::BackupTable(String TableName,String BackupPath)
{
int i;
String FieldStr,FullFileName;
String StrBackUpSql;
FullFileName = BackupPath + "\\" + TableName + ".bak";
if(FileExists(FullFileName))
DeleteFile(FullFileName);
TStringList *TableDataList = new TStringList;
TADOQuery *ADOQueryBackupTable = new TADOQuery(Application);
StrBackUpSql = "Select * from " + TableName;
try{
comm->ExecuteSelectSQL(StrBackUpSql,ADOQueryBackupTable);
}
catch(...){
Application->MessageBoxA("数据库出错,请联系系统管理员!","错误", MB_OK|MB_ICONSTOP);
return;
}
TableDataList->Clear();
while(!ADOQueryBackupTable->Eof){
FieldStr = "";
for(i=0;i<ADOQueryBackupTable->Fields->Count;i++){
if(ADOQueryBackupTable->Fields->Fields[i]->IsNull || ADOQueryBackupTable->Fields->Fields[i]->AsString=="")
FieldStr += " #*#$#*#";
else
FieldStr += ADOQueryBackupTable->Fields->Fields[i]->AsString + "#*#$#*#";
}
TableDataList->Add(FieldStr);
ADOQueryBackupTable->Next();
}
try{
TableDataList->SaveToFile(FullFileName);
FailFlag += 1;
}catch(...){
fFlag += 1;
}
if(FailFlag==4)
//Application->MessageBoxA("备份成功!","消息",MB_OK|MB_ICONINFORMATION);
if(fFlag>0)
Application->MessageBoxA("执行操作时发生了异常错误,数据库备份没有成功,\n请稍后重试或者联系数据库管理员","错误",MB_OK|MB_ICONSTOP);
ADOQueryBackupTable->Close();
delete ADOQueryBackupTable;
ADOQueryBackupTable = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::DeleteDir(String dir)
{
char Path[256];
SHFILEOPSTRUCT sfo;
memset(&sfo,0,sizeof(sfo));
memset(Path,0,sizeof(Path));
strcpy(Path,dir.c_str());
sfo.wFunc = FO_DELETE;
sfo.pFrom = Path;
sfo.fFlags = FOF_NOCONFIRMATION;
SHFileOperation(&sfo);
}
#5
starstargao(高顾) 那要是把备份的表还原又怎么处理呀
难道没有sql语句可以实现吗?
难道没有sql语句可以实现吗?
#6
应该可以的
查询一下SQL手册
查询一下SQL手册
#7
void RestoreDatabase(String FilePath)
{
if(FileExists(FilePath+"\\sys_fee_total.bak"))
WriteToTable("sys_fee_total",FilePath+"\\sys_fee_total.bak",10);
if(FileExists(FilePath+"\\tran_ls.bak"))
WriteToTable("tran_ls",FilePath+"\\tran_ls.bak",14);
if(FileExists(FilePath+"\\user_fee.bak"))
WriteToTable("user_fee",FilePath+"\\user_fee.bak",14);
if(FileExists(FilePath+"\\user_info.bak"))
WriteToTable("user_info",FilePath+"\\user_info.bak",27);
if(FileExists(FilePath+"\\user_tran.bak"))
WriteToTable("user_tran",FilePath+"\\user_tran.bak",9);
if(FileExists(FilePath+"\\work_manager.bak"))
WriteToTable("work_manager",FilePath+"\\work_manager.bak",14);
}
//---------------------------------------------------------------------------
void WriteToTable(String TableName,String DataFilePath,int FieldCount)
{
TADOQuery *RestoreQuery = new TADOQuery(Application);
RestoreQuery->Connection = catvmain->ADOConnection1;
FILE *stream;
char ALineData[10000],*p;
int len =10000,myCount;
String sql;
stream = fopen(DataFilePath.c_str(), "r");
if(stream){
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = "delete from " + TableName;
RestoreQuery->ExecSQL();
while(fgets(ALineData, len, stream)){
myCount = FieldCount;
sql = "insert into "+TableName +" values(";
p = strtok(ALineData,"#*#$#*#");
if(p){
sql += "'"+AnsiString(p)+"'";
myCount -= 1;
}
while(p){
p = strtok(NULL,"#*#$#*#");
if(p && myCount>0){
if(AnsiString(p).Trim()=="")
sql += ",null";
else
sql += ",'"+AnsiString(p)+"'";
myCount -= 1;
}
}
sql += ")";
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = sql;
try{
RestoreQuery->ExecSQL();
}catch(...){
continue;
}
}
}
fclose(stream);
}
{
if(FileExists(FilePath+"\\sys_fee_total.bak"))
WriteToTable("sys_fee_total",FilePath+"\\sys_fee_total.bak",10);
if(FileExists(FilePath+"\\tran_ls.bak"))
WriteToTable("tran_ls",FilePath+"\\tran_ls.bak",14);
if(FileExists(FilePath+"\\user_fee.bak"))
WriteToTable("user_fee",FilePath+"\\user_fee.bak",14);
if(FileExists(FilePath+"\\user_info.bak"))
WriteToTable("user_info",FilePath+"\\user_info.bak",27);
if(FileExists(FilePath+"\\user_tran.bak"))
WriteToTable("user_tran",FilePath+"\\user_tran.bak",9);
if(FileExists(FilePath+"\\work_manager.bak"))
WriteToTable("work_manager",FilePath+"\\work_manager.bak",14);
}
//---------------------------------------------------------------------------
void WriteToTable(String TableName,String DataFilePath,int FieldCount)
{
TADOQuery *RestoreQuery = new TADOQuery(Application);
RestoreQuery->Connection = catvmain->ADOConnection1;
FILE *stream;
char ALineData[10000],*p;
int len =10000,myCount;
String sql;
stream = fopen(DataFilePath.c_str(), "r");
if(stream){
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = "delete from " + TableName;
RestoreQuery->ExecSQL();
while(fgets(ALineData, len, stream)){
myCount = FieldCount;
sql = "insert into "+TableName +" values(";
p = strtok(ALineData,"#*#$#*#");
if(p){
sql += "'"+AnsiString(p)+"'";
myCount -= 1;
}
while(p){
p = strtok(NULL,"#*#$#*#");
if(p && myCount>0){
if(AnsiString(p).Trim()=="")
sql += ",null";
else
sql += ",'"+AnsiString(p)+"'";
myCount -= 1;
}
}
sql += ")";
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = sql;
try{
RestoreQuery->ExecSQL();
}catch(...){
continue;
}
}
}
fclose(stream);
}
#8
select * into bak from table
#9
如果一定要用bcp的话,这是我曾经用过的办法.
我使用这个方法的平台是WINDOWS 2000+SQL SERVER 2000.
SQL SERVER的登陆方式是WINDOWS认证.
先在TFORM里面放一个TADOQUERY,假设TADOQUERY的名字是ADOQUERY1,里面可以填写SQL语句.
把master数据库里面的表a导出到a.txt的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a out c:\a.txt -c -S(local) -T'
把a.txt导入到bak数据库里面的表a的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a in c:\a.txt -c -S(local) -T'
不知道你需不需要用到这些东西,希望对你有帮助.
我使用这个方法的平台是WINDOWS 2000+SQL SERVER 2000.
SQL SERVER的登陆方式是WINDOWS认证.
先在TFORM里面放一个TADOQUERY,假设TADOQUERY的名字是ADOQUERY1,里面可以填写SQL语句.
把master数据库里面的表a导出到a.txt的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a out c:\a.txt -c -S(local) -T'
把a.txt导入到bak数据库里面的表a的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a in c:\a.txt -c -S(local) -T'
不知道你需不需要用到这些东西,希望对你有帮助.
#10
在SQL 2000中,系统只提供这个数据库的备份,而如果要备份单个表的,要么用SQL语句将表中的记录导入的另一个备份表中,还原时,在从备份表中将记录写入原来的表,就可以了;要么就用系统系统的导入/导出操作,将表的记录导入/导出。我就是这么做的,不过自己写语句方便一些,毕竟一切尽在掌握中嘛!:)
#11
最省事的办法:
用ADOTABLE 连接到要备份的数据表,用ADOTABLE->SaveToFile(filename)将数据备份到指定的文件中,用ADOTABLE->LoadFromFile(filename)将数据恢复
大家出了这么多主意,快散分吧!
用ADOTABLE 连接到要备份的数据表,用ADOTABLE->SaveToFile(filename)将数据备份到指定的文件中,用ADOTABLE->LoadFromFile(filename)将数据恢复
大家出了这么多主意,快散分吧!
#12
gz
#13
To : pqx2002(阿潘)
你好,你的方法很好,我现在有个问题就是:当我把表备份了,可是当我还原的时候我的数据库中的表的结构已经改变了,也就是我的字段和我备份的表的字段不吻合了,那他还能成功吗,这样的情况我应该怎么办呀,谢谢
你好,你的方法很好,我现在有个问题就是:当我把表备份了,可是当我还原的时候我的数据库中的表的结构已经改变了,也就是我的字段和我备份的表的字段不吻合了,那他还能成功吗,这样的情况我应该怎么办呀,谢谢
#14
如果数据结构改变了,可以先将数据恢复到临时表,再用 insert 语句对齐字段插入了,注意要判断记录是否存在关键字重复。不过老兄,你似乎不用考虑这么多吧,数据结构都改,那你最好做一个独立的恢复工具,用来对齐两个表的字段,同时检测是否主键冲突。
#1
windows和sql server身份验证,这样子是可以的
bcp "mydb..mytable " out "d:\outtable.txt" -c -U"sa" -P"pass"
bcp "mydb..mytable " out "d:\outtable.txt" -c -U"sa" -P"pass"
#2
在SQLSERVER2000中的备份只能对整个库进行操作,生成备份文件。
至于单个表的备份可用导入导出操作来完成,此项操作在企业管理器中选择单个表按右键就能找到,导入(还原)导出(备份)操作有向导程序。
用命令导入导出如yingyys所写,具体参数可参照SQLSERVER帮助。
至于单个表的备份可用导入导出操作来完成,此项操作在企业管理器中选择单个表按右键就能找到,导入(还原)导出(备份)操作有向导程序。
用命令导入导出如yingyys所写,具体参数可参照SQLSERVER帮助。
#3
用个SQL语句是可以的,你用一个ADOQuery控件,然后设置它的SQL语名为以下:
DUMP TABLE 数据库中的表名 TO 你要备份的表名 WITH STATS
然后ExecSQL就可以备份你的数据库表啦。
DUMP TABLE 数据库中的表名 TO 你要备份的表名 WITH STATS
然后ExecSQL就可以备份你的数据库表啦。
#4
void __fastcall TfrmClearData::BackupDatabase(void)
{
String dir,deleteDir;
ffblk ffblk;
dir = ExtractFilePath(ParamStr(0)) + "\\DataBaseBuckup\\";
if(!DirectoryExists(dir)){
CreateDir(dir);
}
BackupTable("tb_TranProcess",dir);
BackupTable("tb_PresentTranProcess",dir);
BackupTable("tb_CumulateDot",dir);
BackupTable("tb_ForwardDot",dir);
}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::BackupTable(String TableName,String BackupPath)
{
int i;
String FieldStr,FullFileName;
String StrBackUpSql;
FullFileName = BackupPath + "\\" + TableName + ".bak";
if(FileExists(FullFileName))
DeleteFile(FullFileName);
TStringList *TableDataList = new TStringList;
TADOQuery *ADOQueryBackupTable = new TADOQuery(Application);
StrBackUpSql = "Select * from " + TableName;
try{
comm->ExecuteSelectSQL(StrBackUpSql,ADOQueryBackupTable);
}
catch(...){
Application->MessageBoxA("数据库出错,请联系系统管理员!","错误", MB_OK|MB_ICONSTOP);
return;
}
TableDataList->Clear();
while(!ADOQueryBackupTable->Eof){
FieldStr = "";
for(i=0;i<ADOQueryBackupTable->Fields->Count;i++){
if(ADOQueryBackupTable->Fields->Fields[i]->IsNull || ADOQueryBackupTable->Fields->Fields[i]->AsString=="")
FieldStr += " #*#$#*#";
else
FieldStr += ADOQueryBackupTable->Fields->Fields[i]->AsString + "#*#$#*#";
}
TableDataList->Add(FieldStr);
ADOQueryBackupTable->Next();
}
try{
TableDataList->SaveToFile(FullFileName);
FailFlag += 1;
}catch(...){
fFlag += 1;
}
if(FailFlag==4)
//Application->MessageBoxA("备份成功!","消息",MB_OK|MB_ICONINFORMATION);
if(fFlag>0)
Application->MessageBoxA("执行操作时发生了异常错误,数据库备份没有成功,\n请稍后重试或者联系数据库管理员","错误",MB_OK|MB_ICONSTOP);
ADOQueryBackupTable->Close();
delete ADOQueryBackupTable;
ADOQueryBackupTable = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::DeleteDir(String dir)
{
char Path[256];
SHFILEOPSTRUCT sfo;
memset(&sfo,0,sizeof(sfo));
memset(Path,0,sizeof(Path));
strcpy(Path,dir.c_str());
sfo.wFunc = FO_DELETE;
sfo.pFrom = Path;
sfo.fFlags = FOF_NOCONFIRMATION;
SHFileOperation(&sfo);
}
#5
starstargao(高顾) 那要是把备份的表还原又怎么处理呀
难道没有sql语句可以实现吗?
难道没有sql语句可以实现吗?
#6
应该可以的
查询一下SQL手册
查询一下SQL手册
#7
void RestoreDatabase(String FilePath)
{
if(FileExists(FilePath+"\\sys_fee_total.bak"))
WriteToTable("sys_fee_total",FilePath+"\\sys_fee_total.bak",10);
if(FileExists(FilePath+"\\tran_ls.bak"))
WriteToTable("tran_ls",FilePath+"\\tran_ls.bak",14);
if(FileExists(FilePath+"\\user_fee.bak"))
WriteToTable("user_fee",FilePath+"\\user_fee.bak",14);
if(FileExists(FilePath+"\\user_info.bak"))
WriteToTable("user_info",FilePath+"\\user_info.bak",27);
if(FileExists(FilePath+"\\user_tran.bak"))
WriteToTable("user_tran",FilePath+"\\user_tran.bak",9);
if(FileExists(FilePath+"\\work_manager.bak"))
WriteToTable("work_manager",FilePath+"\\work_manager.bak",14);
}
//---------------------------------------------------------------------------
void WriteToTable(String TableName,String DataFilePath,int FieldCount)
{
TADOQuery *RestoreQuery = new TADOQuery(Application);
RestoreQuery->Connection = catvmain->ADOConnection1;
FILE *stream;
char ALineData[10000],*p;
int len =10000,myCount;
String sql;
stream = fopen(DataFilePath.c_str(), "r");
if(stream){
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = "delete from " + TableName;
RestoreQuery->ExecSQL();
while(fgets(ALineData, len, stream)){
myCount = FieldCount;
sql = "insert into "+TableName +" values(";
p = strtok(ALineData,"#*#$#*#");
if(p){
sql += "'"+AnsiString(p)+"'";
myCount -= 1;
}
while(p){
p = strtok(NULL,"#*#$#*#");
if(p && myCount>0){
if(AnsiString(p).Trim()=="")
sql += ",null";
else
sql += ",'"+AnsiString(p)+"'";
myCount -= 1;
}
}
sql += ")";
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = sql;
try{
RestoreQuery->ExecSQL();
}catch(...){
continue;
}
}
}
fclose(stream);
}
{
if(FileExists(FilePath+"\\sys_fee_total.bak"))
WriteToTable("sys_fee_total",FilePath+"\\sys_fee_total.bak",10);
if(FileExists(FilePath+"\\tran_ls.bak"))
WriteToTable("tran_ls",FilePath+"\\tran_ls.bak",14);
if(FileExists(FilePath+"\\user_fee.bak"))
WriteToTable("user_fee",FilePath+"\\user_fee.bak",14);
if(FileExists(FilePath+"\\user_info.bak"))
WriteToTable("user_info",FilePath+"\\user_info.bak",27);
if(FileExists(FilePath+"\\user_tran.bak"))
WriteToTable("user_tran",FilePath+"\\user_tran.bak",9);
if(FileExists(FilePath+"\\work_manager.bak"))
WriteToTable("work_manager",FilePath+"\\work_manager.bak",14);
}
//---------------------------------------------------------------------------
void WriteToTable(String TableName,String DataFilePath,int FieldCount)
{
TADOQuery *RestoreQuery = new TADOQuery(Application);
RestoreQuery->Connection = catvmain->ADOConnection1;
FILE *stream;
char ALineData[10000],*p;
int len =10000,myCount;
String sql;
stream = fopen(DataFilePath.c_str(), "r");
if(stream){
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = "delete from " + TableName;
RestoreQuery->ExecSQL();
while(fgets(ALineData, len, stream)){
myCount = FieldCount;
sql = "insert into "+TableName +" values(";
p = strtok(ALineData,"#*#$#*#");
if(p){
sql += "'"+AnsiString(p)+"'";
myCount -= 1;
}
while(p){
p = strtok(NULL,"#*#$#*#");
if(p && myCount>0){
if(AnsiString(p).Trim()=="")
sql += ",null";
else
sql += ",'"+AnsiString(p)+"'";
myCount -= 1;
}
}
sql += ")";
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = sql;
try{
RestoreQuery->ExecSQL();
}catch(...){
continue;
}
}
}
fclose(stream);
}
#8
select * into bak from table
#9
如果一定要用bcp的话,这是我曾经用过的办法.
我使用这个方法的平台是WINDOWS 2000+SQL SERVER 2000.
SQL SERVER的登陆方式是WINDOWS认证.
先在TFORM里面放一个TADOQUERY,假设TADOQUERY的名字是ADOQUERY1,里面可以填写SQL语句.
把master数据库里面的表a导出到a.txt的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a out c:\a.txt -c -S(local) -T'
把a.txt导入到bak数据库里面的表a的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a in c:\a.txt -c -S(local) -T'
不知道你需不需要用到这些东西,希望对你有帮助.
我使用这个方法的平台是WINDOWS 2000+SQL SERVER 2000.
SQL SERVER的登陆方式是WINDOWS认证.
先在TFORM里面放一个TADOQUERY,假设TADOQUERY的名字是ADOQUERY1,里面可以填写SQL语句.
把master数据库里面的表a导出到a.txt的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a out c:\a.txt -c -S(local) -T'
把a.txt导入到bak数据库里面的表a的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a in c:\a.txt -c -S(local) -T'
不知道你需不需要用到这些东西,希望对你有帮助.
#10
在SQL 2000中,系统只提供这个数据库的备份,而如果要备份单个表的,要么用SQL语句将表中的记录导入的另一个备份表中,还原时,在从备份表中将记录写入原来的表,就可以了;要么就用系统系统的导入/导出操作,将表的记录导入/导出。我就是这么做的,不过自己写语句方便一些,毕竟一切尽在掌握中嘛!:)
#11
最省事的办法:
用ADOTABLE 连接到要备份的数据表,用ADOTABLE->SaveToFile(filename)将数据备份到指定的文件中,用ADOTABLE->LoadFromFile(filename)将数据恢复
大家出了这么多主意,快散分吧!
用ADOTABLE 连接到要备份的数据表,用ADOTABLE->SaveToFile(filename)将数据备份到指定的文件中,用ADOTABLE->LoadFromFile(filename)将数据恢复
大家出了这么多主意,快散分吧!
#12
gz
#13
To : pqx2002(阿潘)
你好,你的方法很好,我现在有个问题就是:当我把表备份了,可是当我还原的时候我的数据库中的表的结构已经改变了,也就是我的字段和我备份的表的字段不吻合了,那他还能成功吗,这样的情况我应该怎么办呀,谢谢
你好,你的方法很好,我现在有个问题就是:当我把表备份了,可是当我还原的时候我的数据库中的表的结构已经改变了,也就是我的字段和我备份的表的字段不吻合了,那他还能成功吗,这样的情况我应该怎么办呀,谢谢
#14
如果数据结构改变了,可以先将数据恢复到临时表,再用 insert 语句对齐字段插入了,注意要判断记录是否存在关键字重复。不过老兄,你似乎不用考虑这么多吧,数据结构都改,那你最好做一个独立的恢复工具,用来对齐两个表的字段,同时检测是否主键冲突。