共计 4218 个字符,预计需要花费 11 分钟才能阅读完成。
本篇文章给大家分享的是有关如何复制 Image 字段数据到新表同样的字段内,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。
最近在写一个升级程序,其中要求将一个旧数据库里面的所有的照片都转到新数据库。暂且把旧数据库叫 OldDB, 新数据库叫 NewDB, 新数据库里面的字段为【Photo】, 旧数据库叫【Picture】。下面丸趣 TV 丸趣 TV 小编来讲解下如何复制 Image 字段数据到新表同样的字段内?
如何复制 Image 字段数据到新表同样的字段内
先读出旧数据库里的数据,然后用 insert into 插入:
insert into[table1] values(rs( Picture) )
后来发现不行,我以为数据类型搞错了,改了下代码,如下:
insert into[table1] values(‘rs( Picture)’)
多加了一对单引号,系统还是提示错误。以下为存储过程:
CENTER ccid_nobr
table width= 400 border= 1 cellspacing= 0 cellpadding= 2 bordercolorlight = black bordercolordark = #FFFFFF align= center
tr
td bgcolor= e6e6e6 >
pre ccid_code
if exists (select * from dbo.sysobjects
where id = object_id(N [dbo].[sp_textcopy] )
and OBJECTPROPERTY(id, N IsProcedure) = 1)
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
/ccid_code /pre
/td
/tr
/table
/ccid_nobr /CENTER
这是调用 textcopy 将图片数据导入和导出的语句,我原打算新旧数据库调用同一个存储过程,旧数据库先将数据导出到硬盘,新数据库在导入。在测试以后,发现不成功,页面显示不出数据,单独用 textcopy 测试还是可以导出数据的,但在程序中调用,没有成功。我接下来换成下面的存储过程:
CENTER ccid_nobr
table width= 400 border= 1 cellspacing= 0 cellpadding= 2 bordercolorlight = black bordercolordark = #FFFFFF align= center
tr
td bgcolor= e6e6e6 >
pre ccid_code
if exists (select * from dbo.sysobjects
where id = object_id(N [dbo].[sp_imageio] )
and OBJECTPROPERTY(id, N IsProcedure) = 1)
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
/ccid_code /pre
/td
/tr
/table
/ccid_nobr /CENTER
如何复制 Image 字段数据到新表同样的字段内
这个存储过程,基本原理其实和上面的是一样的。我先测试导出,在程序中运行后,不断刷新保存导出图片的文件夹,发现系统确实产生了数据,以文件 +tmp 的命名方式存放,但不知道为什么,系统运行完毕,所有的图片还是没有。这条路看来不通。
帖子发出来以后,很快有人回复。但是回复的答案就是我找到的两个存储过程的。看来问题可能无法解决。
但是任务还是的完成,最后万般无奈之下,我给认识的一位大侠发了求救信,他只是提供了一条思路,用流的方式写入。我按照这个思路,抱着试试看的心情,将代码改成如下的样式:
set rs2=Server.CreateObject(Adodb.Recordset)
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 字段数据到新表同样的字段内,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。