如何打包数据库?

edwardlj 2003-08-24 09:14:33
兄弟现在做一个将数据库中的记录进行打包和解包的工作,用ADO,SQL SERVER。数据库中有N个表,每个表的 字段数不同,我的思路是先读出每个表的每条记录,然后分别读他们的字段值,全部转为字符串后将一条记录拼为一个大字符串,写入文件中,解的过程则相反,但逐记录逐字段的处理效率好像不高,不知道是否有更高效一些的方法。再有,如何在程序中知道一条记录里的字段个数?
...全文
123 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdslah 2003-08-25
  • 打赏
  • 举报
回复
收藏
hjb111 2003-08-24
  • 打赏
  • 举报
回复
使用BCP命令:先把你转换成.txt文件!再把此.txt文件转成你的表中!

EXEC master..xp_cmdshell 'bcp YourDatabase.dbo.Yourtable out d:\Yourtxt.txt -c -q -S"YourServerName" -U"sa" -P"YourPassWord"'
//导出

EXEC master..xp_cmdshell 'bcp YourDatabase.dbo.Yourtable in D:\Yourtxt.txt -c -q -S"YourServerName" -U"sa" -P"YourPassWord"'
//导入

511214 2003-08-24
  • 打赏
  • 举报
回复
再有,如何在程序中知道一条记录里的字段个数?
rs.fields.count即可
pengdali 2003-08-24
  • 打赏
  • 举报
回复
EXEC master..xp_cmdshell 'bcp test.dbo.P_Aspect in c:\temp1.txt -c -q -S"servername" -U"sa" -P""'
//导入

EXEC master..xp_cmdshell 'bcp test.dbo.P_Aspect out c:\temp1.txt -c -q -S"servername" -U"sa" -P""'
//导出
zjcxc 2003-08-24
  • 打赏
  • 举报
回复
用bcp实现的存储过程


/*
实现数据导入/导出的存储过程
根据不同的参数,可以实现导入/导出整个数据库/单个表
调用示例:
--导出调用示例
----导出单个表
exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1
----导出整个数据库
exec file2table 'zj','','','xzkh_sa','C:\docman',1

--导入调用示例
----导入单个表
exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0
----导入整个数据库
exec file2table 'zj','','','xzkh_sa','C:\docman',0

*/
if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
drop procedure File2Table
go
create procedure File2Table
@servername varchar(200) --服务器名
,@username varchar(200) --用户名,如果用NT验证方式,则为空''
,@password varchar(200) --密码
,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
,@isout bit --1为导出,0为导入
as
declare @sql varchar(8000)

if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表
begin
set @sql='bcp '+@tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+'" /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
end
else
begin --导出整个数据库,定义游标,取出所有的用户表
declare @m_tbname varchar(250)
if right(@filename,1)<>'\' set @filename=@filename+'\'

set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U'''
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
set @sql='bcp '+@tbname+'..'+@m_tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+@m_tbname+'.txt " /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go
zjcxc 2003-08-24
  • 打赏
  • 举报
回复
直接用数据库备份/恢复不行吗?

leimin 2003-08-24
  • 打赏
  • 举报
回复
1.建立一个OUT.BAT文件,导出所有的表的记录:
if [%1] == [] goto Usage
if [%2] == [] goto Usage
CLS
@bcp %2.dbo.TABLENAME1 out INC_ACCT.out -N /Usa /P /S%1
@bcp %2.dbo.TABLENAME2 out INC_ACCT.out -N /Usa /P /S%1
.....

:Usage
echo.
echo Usage: %0 SQLSERVER_NAME Database_Name
然后在DOS提示符下运行:OUT SQLSERVER_NAME Database_Name

2.建立一个in.BAT文件,导出所有的表的记录

if [%1] == [] goto Usage
if [%2] == [] goto Usage
CLS
@bcp %2.dbo.TABLENAME1 in INC_ACCT.out -N /Usa /P /S%1
@bcp %2.dbo.TABLENAME2 in INC_ACCT.out -N /Usa /P /S%1
.....

:Usage
echo.
echo Usage: %0 SQLSERVER_NAME Database_Name
3.你还可以建立一个LOG文件,比如:
@bcp %2.dbo.TABLENAME2 in INC_ACCT.out -o tablename2.log -N /Usa /P /S%1

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧