很菜的问题求教——ok,就给分

shadowfish 2003-02-26 04:24:58
如何在sql server2000中插入图片,flash等格式的数据?
...全文
53 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowfish 2003-03-03
  • 打赏
  • 举报
回复
真是不好意思,以为结贴了的,多谢各位,接分吧
shadowfish 2003-02-27
  • 打赏
  • 举报
回复
谢谢谢谢,我公司的机器上用的是oracle,没有sql server,晚上回家试了,就给分,有问题会再请教的……
pengdali 2003-02-26
  • 打赏
  • 举报
回复
if(DATABASE_STATE==INSERT)
{
AnsiString st;
TMemoryStream *tmp = new TMemoryStream();
DBI1->Picture->SaveToFile("TTT.jpg");
tmp->LoadFromFile("TTT.jpg");
DeleteFile("TTT.jpg");
ADOQuery1->Parameters->ParamByName("PIC")->LoadFromStream(tmp,ftBlob);
ADOQuery1->Parameters->ParamByName("TD")->Value=DP1->Date;
st="摄于"+ DP1->Date;
ADOQuery1->Parameters->ParamByName("JPEG")->Value=JpegOrBmp?"BMP":"JPEG";
ADOQuery1->Parameters->ParamByName("IDI")->Value=MEM1->Text + st;
ADOQuery1->Parameters->ParamByName("HEI")->Value=BT->Height;
ADOQuery1->Parameters->ParamByName("WID")->Value=BT->Width;
ADOQuery1->ExecSQL();
ShowMessage("保存" + IntToStr(tmp->Size ));
ShowMessage("成功保存图片!");
delete tmp;
return;
}
pengdali 2003-02-26
  • 打赏
  • 举报
回复
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
pengdali 2003-02-26
  • 打赏
  • 举报
回复
下面是一个拷贝图像到SQL Server的pubs数据库的例子, 表名pub_info, 字段名logo,图像文件名picture.bmp,保存到pub_id='0736'记录
sp_textcopy @srvn
ame = 'ServerName',
@login = 'Login',
@password = 'Password',
@dbname = 'pubs',
@tbname = 'pub_info',
@colname = 'logo',
@filename = 'c:\picture.bmp',
@whereclause = " WHERE pub_id='0736' ",
@direction = 'I'
nik_Amis 2003-02-26
  • 打赏
  • 举报
回复
uip
agice 2003-02-26
  • 打赏
  • 举报
回复

1、 SQL Server中图像数据的存储机制
在MIS SQL Server 中,对于小于 8000 个字节的图像数据可以用二进制型(binary、varbinary)来表示。但通常要保存的一些医学影像图片都会大于 8000个字节。SQL Server提供了一种机制,能存储每行大到 2G的二进制对象(BLOB),这类对象可包括image、text和ntext三种数据类型。Image数据类型存储的是二进制数据,最大长度是 231-1 (2,147,483,647)个字节[2][3]。
BLOB数据在MIS SQL Server系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。
2、 SQL Server中图像数据的存取
在MIS SQL Server中,当数据小于 8000 个字节时,可以用普通的SQL操纵语句(SELECT、INSERT、UPDATE、DELETE)来完成对字段的操纵,当数据大于8000个字节时,SQL提供了 WRITETEXT 、READTEXT和UPDATETEXT这三个函数来读取和修改数据。这三个函数的使用方法为:
(1) WRITETEXT {table.column text_ptr}[WITH LOG] {data}
table.column为表中的字段,text_ptr为一个16个字节的指针,data为要写的数据值。可
选参数WITH LOG表示是否要写入日志文件中。
例: DECLARE @ptrval binary(16) --指针
SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
WRITETEXT zy_ct.img_ct @ptrval 0x024324142342134214213421421454353452341
(2) READTEXT {table.column text_ptr offset size} [HOLDLOCK]
table.column为表中的字段,text_ptr为一个16个字节的指针,offset 为偏移量,即从
第几个字节开始读数据,size为要读的字节数,HOLDLOCK 为在读数据中是否充许其他用户
修改该数据。
例:DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
READTEXT zy_ct.img_ct @ptrval 1 25
(3) UPDATETEXT {table_name.dest_column_name dest_text_ptr}{NULL|insert_offset}
{ NULL | delete_length}[WITH LOG][ inserted_data| {table_name.src_column_name src_text_ptr}]
table_name.dest_column_name 为要修改的text, ntext, 或 image字段;
dest_text_ptr为指向其的指针;insert_offset为偏移量,对于text和image为从
第几开始字节开始写,对于ntext为从第几个字符(双字节)开始写;delete_length
为从insert_offset开始删除delete_length长度的字节(符),为0时不删除,为NULL时
为删除从insert_offset开始到结束的所有数据。要插入的数据为 inserted_data为,也可
是表table_name的src_column_name字段中指针 src_text_ptr所指数据。
例: DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
UPDATETEXT zy_ct.img_ct @ptrval 16 0x54345
可以看出,这三个函数的使用比较复杂,虽然可以通过生成存贮过程来调用执行,但有一个缺陷是在读取数据时,READTEXT函数读取的数据无法直接传递回前端应用程序。
3、 VB 6.0中图像数据的存取
VB 6.0 的ADO Field 对象提供了GetChunk 方法和AppendChunk 方法来存取BLOB数据[1],这两个函数实质是通过API调用WRITETEXT 、READTEXT和UPDATETEXT这三个函数,简化了调用的方法。
(1)GetChunk 和AppendChunk方法介绍
GetChunk 方法检索其部分或全部长二进制或字符数据[4]。GetChunk 调用返回的数据将赋给“变量”。如果 Size 大于剩余的数据,则 GetChunk 仅返回剩余的数据而无需用空白填充“变量”。如果字段为空,则 GetChunk 方法返回 Null。每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数据。但是,如果从一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO 将认为已从第一个字段中检索出数据。如果在第一个字段上再次调用 GetChunk 方法,ADO 将把调用解释为新的 GetChunk 操作并从记录的起始处开始读取。Field 对象的第一个 AppendChunk 调用将数据写入字段,覆盖所有现有的数据,随后的 AppendChunk 调用则添加到现有数据。
由于系统资源总是有限的,如果一次读(存)取大量数据,可能会引起服务器、客户机死机或是服务器的性能大大下降,因此使用这两个函数时,要将图像数据进行分段读写。
(2)程序实现
程序一:写数据函数
Public Function AppendBlobFromFile(blobColumn As ADODB.Field, ByVal FileName) As Boolean
Dim FileNumber As Integer '文件号
Dim DataLen As Long '文件长度
Dim Chunks As Long '数据块数
Dim ChunkAry() As Byte '数据块数组
Dim ChunkSize As Long '数据块大小
Dim Fragment As Long '零碎数据大小
Dim lngI As Long '计数器

On Error GoTo ErrorHandle
AppendBlobFromFile = False
ChunkSize = 2048 '限制每次读取的块大小为 2K

FileNumber = FreeFile '产生随机的文件号
Open FileName For Binary Access Read As FileNumber '打开图像文件
DataLen = LOF(FileNumber) '获得文件长度
If IsNull(blobColumn) Then Exit Function

If DataLen = 0 Then '文件长度为0
Close FileNumber
AppendBlobFromFile = True
Exit Function
End If

Chunks = DataLen \ ChunkSize '数据块的个数
Fragment = DataLen Mod ChunkSize
If Fragment > 0 Then '先写零碎数据
ReDim ChunkAry(Fragment - 1)
Get FileNumber, , ChunkAry() '读出文件
blobColumn.AppendChunk ChunkAry '调用AppendChunk函数写数据
End If

ReDim ChunkAry(ChunkSize - 1) '为数据块开辟空间
For lngI = 1 To Chunks '循环读出所有数据块
Get FileNumber, , ChunkAry() '读出一块数据
blobColumn.AppendChunk ChunkAry '在数据库中增加数据块
Next lngI

Close FileNumber '关闭文件
AppendBlobFromFile = True
Exit Function
ErrorHandle:
AppendBlobFromFile = False
MsgBox Err.Description, vbCritical, "写图像数据出错!"
End Function

程序二:读数据函数
Public Function ReadbolbToFile(blobColumn As ADODB.Field, ByVal FileName) As Boolean
Dim FileNumber As Integer '文件号
Dim DataLen As Long '文件长度
Dim Chunks As Long '数据块数
Dim ChunkAry() As Byte '数据块数组
Dim ChunkSize As Long '数据块大小
Dim Fragment As Long '零碎数据大小
Dim lngI As Long '计数器

On Error GoTo ErrorHandle
ReadbolbToFile= False
ChunkSize = 2048 '定义块大小为 2K
If IsNull(blobColumn) Then Exit Function

DataLen = blobColumn.ActualSize '获得图像大小
If DataLen < 8 Then Exit Function '图像大小小于8字节时认为不是图像信息
FileNumber = FreeFile '产生随机的文件号
Open FileName For Binary Access Write As FileNumber '打开存放图像数据文件
Chunks = DataLen \ ChunkSize '数据块数
Fragment = DataLen Mod ChunkSize '零碎数据
If Fragment > 0 Then '有零碎数据,则先读该数据
ReDim ChunkAry(Fragment - 1)
ChunkAry = blobColumn.GetChunk(Fragment)
Put FileNumber, , ChunkAry '写入文件
End If

ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间
For lngI = 1 To Chunks '循环读出所有块
ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块
Put FileNumber, , ChunkAry() '将数据块写入文件中
Next lngI
Close FileNumber '关闭文件
ReadbolbToFile= True
Exit Function
ErrorHandle:
ReadbolbToFile= False
MsgBox Err.Description, vbCritical, "读图像数据出错!"
End Function
当BLOB类型的字段为空时,调用AppendChunk或 GetChunk函数将出错。此时如果想给该字段插入图像数据,应该先使用 Update语句给该字段赋初值如0x0,以便数据库系统为该字段分配一个页面地址来存放BLOB数据。
4、 总结
Microsoft SQL Server为保存大二进制数据提供了存储平台,Visual Basic 6.0为存取这种数据提供了灵活的接口。本文介绍的用VB接口存取 MIS SQL Server中大二进制数据的方法,不但适用于图像文件,同样适用于其它类型的文件。该方法应用于医院管理系统的图像存取中,在存取速度、对系统的性能影响等方面都取了满意的效果。
shadowfish 2003-02-26
  • 打赏
  • 举报
回复
也就是说字段用文本类型?
不是把,access都能插入图片、mp3……为什么sqlserver不能??
以前我见过解决的方法的,是用sql语句存储的,只是忘了收藏了
huxin1012 2003-02-26
  • 打赏
  • 举报
回复
就是,不如在数据库中存放路径及文件名称信息。
shadowfish 2003-02-26
  • 打赏
  • 举报
回复
呵呵,用image类型我知道,但是就不知道怎么用

那如果要在数据库中存储图片怎么处理啊??
愉快的登山者 2003-02-26
  • 打赏
  • 举报
回复
可以用image类型。
数据量太大,有必要吗?

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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