如何复制Image字段数据到新表同样的字段内
创始人
2024-12-19 04:22:07
0次

  最近在写一个升级程序,其中要求将一个旧数据库里面的所有的照片都转到新数据库。暂且把旧数据库叫OldDB,新数据库叫NewDB,新数据库里面的字段为【Photo】,旧数据库叫【Picture】 。下面小编来讲解下如何复制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" class="code" >

  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" class="code" >

  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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...