问一个关于存储过程、Image类型以及在Delphi中调用的问题,请马可、邹键、大力等高手指教!!!

jxc163 2004-01-06 01:37:29
在MS SQL 2000中创建存储过程 T_AddImage,T_GetImage对表T_Image(两个字段Name和BMP,分别对应sysname及Image类型)进行操作。
声明为:
Create procedure t_addimage @name sysname,@image image
as
--SQL 语句用来在表中添加记录。

Create procedure t_getimage @name sysname,@image image output
as
--SQL 语句用来在表中按@Name检索数据并在@Image中返回。

以及这两个过程在Delphi的调用方式,主要是类型的对应。

说明:要保存到表T_image中的可能是BMP图片、JPG图片、GIF动画、DOC文档或其它任何类型的文件。
...全文
162 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxc163 2004-01-12
  • 打赏
  • 举报
回复
自己顶!
jxc163 2004-01-08
  • 打赏
  • 举报
回复
TO leimin:
请教老大,你说第二个问题是可以的,怎么又说是不合法的,请问怎么具体实现?

你说的第一个方法我用过。我的想法是能不能把值读入一个变量返回,而不是在表格中显示。
jxc163 2004-01-07
  • 打赏
  • 举报
回复
用什么方法可以把ReadText读出的方法放到一个变量中?

SQL不会用,再问一个可笑的问题:
用DataLen可以得到一个字符串的长度,当然也可以得到一个文本指针的数据长度。能否这样进行声明,先声明一个变量用来保存这个长度值(@Len),再用这个长度值去声明另一个变量,假如: @Name char(@Len) 这样的形式,有没有什么方法可以达到类似的目的。
leimin 2004-01-07
  • 打赏
  • 举报
回复
下面是MSSQLSERVER的在线帮助的实例,你可以声明一个VARBINARY(16)的变量就可以获得TXET记录的指针,
USE pubs
GO
DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(pr_info)
FROM pub_info pr INNER JOIN publishers p
ON pr.pub_id = p.pub_id
AND p.pub_name = 'New Moon Books'
READTEXT pub_info.pr_info @ptrval 1 25
GO
第二个问题是可以的:

declare @Name char(@Len) 这样是不和法的!
txlicenhe 2004-01-06
  • 打赏
  • 举报
回复
想用存储过程传入image类型的参数估计可能性不大,我是不会。
考虑用邹建的方法或在前台处理吧。
jxc163 2004-01-06
  • 打赏
  • 举报
回复
几位老兄说的都是直接读取文件到数据库中的,我想要的方法是:
比如一个BMP图片,在程序中已经在一个图片框中显示出来了,也就是说已经读取到内存了,现在要做的就是直接把内存中的这段内容保存到SQL中,用T_AddImage存储过程。
而用T_GetImage从表中读出信息后保存到变量,然后用一个图片框来显示它。

这里不再使用磁盘文件,即使是临时文件。
Arionma 2004-01-06
  • 打赏
  • 举报
回复
从别的地方转过来的,仅供参考
在SQL Server中建立TEST表,两个字段,id varchar(10),photo image(16);

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
openpicturedialog1.execute;
image1.picture.loadfromfile(openpicturedialog1.filename);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
graphic1:Timage;
begin
graphic1:=Timage.Create(self);
graphic1.picture.loadfromfile(openpicturedialog1.filename);
table1.Open;
table1.insert;
table1.fieldbyname(’id’).asstring:=’121’;
table1.fields[1].assign(graphic1.Picture);
table1.post;
table1.close;
graphic1.free;
end;
playyuer 2004-01-06
  • 打赏
  • 举报
回复
bcp 必须保证 SQL Server 在操作系统下可以访问 Image 所在的机器!
zjcxc 2004-01-06
  • 打赏
  • 举报
回复
程序中建议直接用ADO.Stream处理.

没用过delphi,所以也没办法写对应的过程.


更多的参考我的贴子:

数据库中存/取文件
http://expert.csdn.net/Expert/topic/2403/2403509.xml?temp=8.602542E-02
zjcxc 2004-01-06
  • 打赏
  • 举报
回复
/*--利用 textcopy.exe文件实现在数据库中存储/读取文件

需要textcopy.exe文件,该文件可以在sql 7.0安装光盘找到

--转贴自大力--*/

--建立存取处理的存储过程
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

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) --I 为存储到数据库,O 从数据库中读出成文件
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


--调用示例:
--1.创建示例表和初始化数据
create table tb(id int,img image)
insert tb
select 1,0x
union all select 2,0x
go

--2.将文件保存到数据库中
declare @srv varchar(255),@db sysname,@tb sysname,@col sysname
select @srv=@@servername --服务器名
,@db=db_name() --数据库名
,@tb='tb' --表名
,@col='img' --列名
sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:\test.jpg','where id=1','I' --保存到id=1的记录中,注意条件是:id=1
sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:\test.doc','where id=2','I' --保存到id=2的记录中,注意条件是:id=2

--3.从数据库中读出保存为文件
sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:\test.jpg','where id=1','O' --读出id=1的记录,注意条件是:id=1
sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:\test.doc','where id=2','O' --读出id=2的记录,注意条件是:id=2

--删除测试环境
drop table tb
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]
zjcxc 2004-01-06
  • 打赏
  • 举报
回复
/*--bcp 实现二进制文件的导入导出

支持image,text,ntext字段的导入/导出
image适合于二进制文件,包括:Word文档,Excel文档,图片,音乐等
text,ntext适合于文本数据文件

注意:导入时,将覆盖满足条件的所有行
导出时,将把所有满足条件的行导出到指定文件中


此存储过程仅用bcp实现
邹建 2003.08-----------------*/

/*--调用示例
--数据导出
exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat'

--数据导入
exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat','',0
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_binaryIO]
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

22,302

社区成员

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

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