SQL SERVER的img类型只能存bmp形式的内容吗?在线等待

hzyyxx 2002-03-07 03:39:04
我将bmp文件内容用ADO导入或导出数据库均成功,但一保存JPG文件就错误,导入数据的时候就有错误,导出的为一张黑图。难道真的是SQL SERVER 的img类型只能存bmp形式的内容,不能保存jpg形式的内容吗?有谁知道原因请告诉我呀!
...全文
89 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hpzha 2002-03-12
  • 打赏
  • 举报
回复
不会是这样的,Image 无区分的存储任何二进制内容!一定不要怀疑这一环节。
hzyyxx 2002-03-07
  • 打赏
  • 举报
回复
bmp格式的文件就可以,其他格式就不行呀,
hzyyxx 2002-03-07
  • 打赏
  • 举报
回复
bmp格式的就可以,其他格式就不行呀,不知道为什么?
kplchx 2002-03-07
  • 打赏
  • 举报
回复
VC !
我不懂,我用DELPHI实现过,原理是把文件转成数据流再保存到数据库。
hzyyxx 2002-03-07
  • 打赏
  • 举报
回复
HANDLE hFile = CreateFile(lpFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
_ASSERTE(INVALID_HANDLE_VALUE != hFile);

// 得到文件大小
DWORD dwFileSize = GetFileSize(hFile, NULL);
_ASSERTE(-1 != dwFileSize);

LPVOID pvData = NULL;
// 开辟文件大小的内存空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal);

pvData = GlobalLock(hGlobal);
_ASSERTE(NULL != pvData);

DWORD dwBytesRead = 0;
// 读文件到内存
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
_ASSERTE(FALSE != bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile);

char *pBufEx;
pBufEx = (char*)pvData;
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];

if(pBufEx)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = dwFileSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象
for (long i = 0; i < (long)dwFileSize; i++)
SafeArrayPutElement (psa, &i, pBufEx++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = psa; ///为varBLOB变量赋值
m_RecordsetPtr->GetFields()->GetItem(lpName)->AppendChunk(varBLOB);///加入BLOB类型的数据
}
kplchx 2002-03-07
  • 打赏
  • 举报
回复
使用 Text 和 Image 数据
Microsoft® SQL Server™ 2000 将大于 8,000 个字符的字符串和大于 8,000 个字节的二进制数据存储为称作 text 和 image 的特殊数据类型。大于 4000 个字符的 Unicode 字符串被存储在 ntext 数据类型中。

例如,必须将一个有关用户信息的大文本文件 (.txt) 导入到 SQL Server 数据库中。应将这些数据作为一个数据块存储起来,而不是集成到数据表的多个列中。为了达到这个目的,可以创建一个 text 数据类型的列。然而,如果必须存储当前作为标记图象文件格式 (TIFF) 图像 (.tif) 存储的、每个大小为 10 KB 的公司徽标,则需创建一个 image 数据类型的列。

如果要存储的文本数据是 unicode 形式,那么应使用 ntext 数据类型。例如,一个为国际客户创建的套用信函很可能包含用于各种不同语言的国际拼写和字符。这种数据应存储到一个 ntext 列中。

每个 text 和 ntext 数据值都有排序规则。排序规则定义特性,如比较规则以及是否区分大小写或重音。text 值的排序规则还指定代码页,后者定义用于表示每个字符的位模式。每个 ntext 值使用对所有排序规则都相同的 Unicode 代码页。每个数据库有默认排序规则。当创建 text 或 ntext 列时,除非使用 COLLATE 子句指派特定的排序规则,否则将为它们指派数据库的默认排序规则。当合并或比较两个具有不同排序规则的 text 或 ntext 值时,排序规则的优先顺序规则决定操作所使用的排序规则。

image 数据中的数据被存储为位串,SQL Server 不对它进行解释。image 列数据的解释必须由应用程序完成。例如,应用程序可以使用 BMP、TIFF、GIF 或 JPEG 格式把数据存储在 image 列中。读取 image 列的数据的应用程序必须识别该数据格式并正确显示数据。image 列所做的全部工作就是提供一个位置,用来存储组成图像数据值的位流。

使用行中的文本存储 text、ntext 和 image 值
通常情况下,text、ntext 或 image 字符串是存储在数据行外的大型(可达 2GB)字符或二进制字符串。数据行只包括一个 16 字节的文本指针,该指针指向一个树的根节点,该树由映射存储串片段的页的内部指针构成。

使用 Microsoft SQL Server,可将小型到中型的 text、ntext 和 image 值存储在一个数据行中,从而提高访问这些值的查询速度。

当 text、ntext 或 image 串被存储在数据行时,SQL Server 就无须访问单独的页或页的集合来读写这些串。这使得读写 text、ntext 或 image 这些行中的串就象读写 varchar、nvarchar 或 varbinary 串一样快。

为了在数据行中存储 text、ntext 或 image 字符串,必须使用 sp_tableoption 存储过程启动 text in row 选项。

sp_tableoption N'MyTable', 'text in row', 'ON'

可以为在数据行中存储的 text、ntext 和 image 字符串指定一个从 24 到 7000 字节的最大长度(可选):

sp_tableoption N'MyTable', 'text in row', '1000'

如果指定的是"ON"而不是一个特定的限度,则此限度的默认值为 256 字节。这个默认值提供大部分的性能收益:这个值足够大,可以保证小型字符串和根文本指针存储在行中;但又不是过大,以致将每页的行减少得太多,从而影响了性能。

尽管在通常情况下,不应将此值设为低于 72,但也不应把此值设得过高,特别是对那些大多数语句都不引用 text、ntext 和 image 列的表格或者具有多个 text、ntext 和 image 列的表格。

也可以使用 sp_tableoption 关闭此选项,这可以通过指定"OFF" 或 0 选项值来实现。



pinel 2002-03-07
  • 打赏
  • 举报
回复
怎么导入的?应该是用binary方式打开文件,存入内存块...
把代码贴出来看看
hzyyxx 2002-03-07
  • 打赏
  • 举报
回复
有人知道吗?

34,873

社区成员

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

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