怎样复制image字段的数据到新表同样的字段里?
来源:互联网 发布:linux怎么退出编辑 编辑:程序博客网 时间:2024/05/18 12:42
最近在写一个升级程序,其中要求将一个旧数据库里面的所有的照片都转到新数据库。暂且把旧数据库叫OldDB,新数据库叫NewDB,新数据库里面的字段为【Photo】,旧数据库叫【Picture】 。开始我是这样做的,先读出旧数据库里的数据,然后用insert into插入:
后来发现不行,我以为数据类型搞错了,改了下代码,如下:
多加了一对单引号,系统还是提示错误。我没有办法了,立即到CSDN上找到了两条存储过程。
drop procedure [dbo].[sp_textcopy]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE sp_textcopy (
@srvname varchar (30),
@login varchar (30),
@password varchar (30),
@dbname varchar (30),
@tbname varchar (30),
@colname varchar (30),
@filename varchar (30),
@whereclause varchar (40),
@direction char(1))
AS
DECLARE @exec_str varchar (255)
SELECT @exec_str =
'textcopy /S ' + @srvname +
' /U ' + @login +
' /P ' + @password +
' /D ' + @dbname +
' /T ' + @tbname +
' /C ' + @colname +
' /W "' + @whereclause +
'" /F ' + @filename +
' /' + @direction
EXEC master..xp_cmdshell @exec_str
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
这是调用textcopy将图片数据导入和导出的语句,我原打算新旧数据库调用同一个存储过程,旧数据库先将数据导出到硬盘,新数据库在导入。在测试以后,发现不成功,页面显示不出数据,单独用textcopy测试还是可以导出数据的,但在程序中调用,没有成功。我接下来换成下面的存储过程:
drop procedure [dbo].[sp_imageio]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
Create proc p_binaryIO
@servename varchar (30),--服务器名称
@username varchar (30), --用户名
@password varchar (30), --密码
@tbname varchar (500), --数据库..表名
@fdname varchar (30), --字段名
@fname varchar (1000), --目录+文件名,处理过程中要使用/覆盖:@filename+_temp
@tj varchar (1000)='', --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀
@isout bit=1 --1导出((默认),0导入
AS
declare @fname_in varchar(1000) --bcp处理应答文件名
,@fsize varchar(20) --要处理的文件的大小
,@m_tbname varchar(50) --临时表名
,@sql varchar(8000)
--则取得导入文件的大小
if @isout=1
set @fsize='0'
else
begin
create table #tb(可选名 varchar(20),大小 int
,创建日期 varchar(10),创建时间 varchar(20)
,上次写操作日期 varchar(10),上次写操作时间 varchar(20)
,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)
insert into #tb
exec master..xp_getfiledetails @fname
select @fsize=大小 from #tb
drop table #tb
if @fsize is null
begin
print '文件未找到'
return
end
end
--生成数据处理应答文件
set @m_tbname='[##temp'+cast(newid() as varchar(40))+']'
set @sql='select * into '+@m_tbname+' from(
select null as 类型
union all select 0 as 前缀
union all select '+@fsize+' as 长度
union all select null as 结束
union all select null as 格式
) a'
exec(@sql)
select @fname_in=@fname+'_temp'
,@sql='bcp "'+@m_tbname+'" out "'+@fname_in
+'" /S"'+@servename
+case when isnull(@username,'')='' then ''
else '" /U"'+@username end
+'" /P"'+isnull(@password,'')+'" /c'
exec master..xp_cmdshell @sql
--删除临时表
set @sql='drop table '+@m_tbname
exec(@sql)
if @isout=1
begin
set @sql='bcp "select top 1 '+@fdname+' from '
+@tbname+case isnull(@tj,'') when '' then ''
else ' where '+@tj end
+'" queryout "'+@fname
+'" /S"'+@servename
+case when isnull(@username,'')='' then ''
else '" /U"'+@username end
+'" /P"'+isnull(@password,'')
+'" /i"'+@fname_in+'"'
exec master..xp_cmdshell @sql
end
else
begin
--为数据导入准备临时表
set @sql='select top 0 '+@fdname+' into '
+@m_tbname+' from ' +@tbname
exec(@sql)
--将数据导入到临时表
set @sql='bcp "'+@m_tbname+'" in "'+@fname
+'" /S"'+@servename
+case when isnull(@username,'')='' then ''
else '" /U"'+@username end
+'" /P"'+isnull(@password,'')
+'" /i"'+@fname_in+'"'
exec master..xp_cmdshell @sql
--将数据导入到正式表中
set @sql='update '+@tbname
+' set '+@fdname+'=b.'+@fdname
+' from '+@tbname+' a,'
+@m_tbname+' b'
+case isnull(@tj,'') when '' then ''
else ' where '+@tj end
exec(@sql)
--删除数据处理临时表
set @sql='drop table '+@m_tbname
end
--删除数据处理应答文件
set @sql='del '+@fname_in
exec master..xp_cmdshell @sql
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
这个存储过程,基本原理其实和上面的是一样的。我先测试导出,在程序中运行后,不断刷新保存导出图片的文件夹,发现系统确实产生了数据,以文件+tmp的命名方式存放,但不知道为什么,系统运行完毕,所有的图片还是没有。这条路看来不通。
没折了,到CSDN发帖子吧,地址:http://community.csdn.net/Expert/topic/5618/5618139.xml?temp=.6252252
帖子发出来以后,很快有人回复。但是回复的答案就是我找到的两个存储过程的。看来问题可能无法解决。
但是任务还是的完成,最后万般无奈之下,我给认识的一位大侠发了求救信,他只是提供了一条思路,用流的方式写入。我按照这个思路,抱着试试看的心情,将代码改成如下的样式:
sql2="select top 1 * from [User] order by UserID desc"
rs2.open sql2,cn,1,3
rs2("Photo").AppendChunk rs("Picture1")
rs2.update
rs2.close
set rs2=nothing
- 怎样复制image字段的数据到新表同样的字段里?
- 怎样向SQL Server插入带有Image字段的记录
- 怎样向SQL Server插入带有Image字段的记录
- 怎样向SQLServer插入带有Image字段的记录
- image字段或二进制字段的读写
- SQL数据库将某表的字段值(指定行)复制到本表另一个字段里
- solor的字段属性+复制域字段+动态域字段
- 复制某个字段一整列的数据到另外一个新的字段的几种方法
- oracle更改字段,表名和复制一列的数据
- 关于MySql里的字段
- 查询出来的数据行,拼接到一个字段里
- 循环得到一条记录中每个字段里的数据
- text与image字段的转换
- C#操作 SQL的 Image字段
- 处理text,ntext,image字段的函数
- 关于怎样在新框架里如何实现防止同一字段的值重复
- 屏幕字段属性结构scrren里的字段含义
- 屏幕字段属性结构scrren里的字段含…
- JSP结合XML+XSLT将输出转换HTML
- SEE MIPS RUN 第六章 内存管理与TLB
- jcrontab和Quartz
- n+1次select查询问题
- 进阶学习Jcrontab
- 怎样复制image字段的数据到新表同样的字段里?
- 内存池(MemPool)技术详解
- 影响ORACLE汉字显示的字符集问题
- Visio中使用通用的图形
- 推荐你的文章到CSDN技术中心
- dwr入门之HelloWorld
- 解决J2ME联网时出现的中文乱码问题
- 如何利用OSWorkflow的function进行任务的分配
- ASP根据数据表结构自动生成数据录入页面