共計 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 行業資訊頻道。