2010-12-17 148 views
1

亲爱的所有人,我在流数据库中遇到问题。
我已经在那里写了一个图像,现在我想回忆并将它放在PictureBox中。
有没有人可以告诉我最好的做法?
非常感谢您提前。从流数据库中读取图像

+0

是否有任何理由不让图像保存在FileSystem中并将元数据保存在dbase中?使用'FileSystem'更容易 – Xaqron 2010-12-17 17:48:16

回答

1

IMO最简单的方法是从数据库中读取所有数据并将其写入MemoryStream。快退流(设置Position=0),然后使用new Bitmap(stream)Image.FromStream。请注意,您应该而不是处置流...位图有效“拥有”流后,您已经构建它。

+0

谢谢你,这是我的第一个想法,但我正在寻找比这更好的东西(如果有的话)。 – 2010-12-17 17:38:09

+0

@Lefteris:你在寻找什么样的“更好”?你对这个解决方案有什么不喜欢的? – 2010-12-17 17:38:50

+0

这不是我不喜欢的,但如果还有其他的东西。据我所知,这是最好的做法。非常感谢你。 – 2010-12-17 17:41:28

2
  1. 加州的ExecuteNonQuery方法来获取与图像的字节数组
  2. 创建字节数组围绕一个新MemoryStream(不破坏流作为Image对象将继续使用它)
  3. 呼叫Image.FromStream读取流
  4. 将此图片设置为PictureBox的Image属性。
1

当图像很小或流量不重要时,上述任何一种方法都能正常工作,并且它们的分辨率很高。由于所有这些解决方案都要求将整个图像作为字节数组存储在内存中,所以随着图像大小的增加,事情开始变得无法控制。如果服务器上的负载很重要,那么将所有这些图像文件副本占用有价值的进程地址空间的空间会增加,并且会显着影响性能。

可能从流语义数据库读取,使没有该文件的完整副本都保存在内存中:

为DataReader提供一种处理 句柄的行,其中包含具有 较大二进制值的列。加载整行而不是 , SequentialAccess使 DataReader能够将数据加载为流。 然后,您可以使用GetBytes或 GetChars方法来指定开始读取操作的位置 位置,并且返回数据 的有限缓冲区大小。

最后一点是一个小问题。您可以将流写入虚拟映射到该站点的WWW服务器本地文件夹,然后将URL返回到该文件。或者你可以有一个URL来读取图片本身,并将图像直接写入ASP输出缓存。第一种方法可以为经常访问的映像付钱,因为缓存文件可以服务多个请求,但它需要失效和清理逻辑。第二种方法更适合于无消息访问的图像,但需要在应用程序中使用适当的路由逻辑。

当事情开始变得非常热时,在封送这些图像时线程被阻塞的问题开始出现,您将不得不移动到Asynchronous pages,这是一个适合流式复制语义的模型。

+0

@Remus Rusanu。我尝试使用您的解决方案,但我面临一些问题。这是显而易见的,有些地方我错了。所以请协助我: – 2010-12-20 09:02:50

+0

Dim readSQLcomm As SqlCommand。 Dim imgReader As SqlDataReader。 Dim imgBuffer()As Byte。昏暗的imgStream作为FileStream。 – 2010-12-20 09:04:10

+0

readSQLcomm =新的SqlCommand(“SELECT”&tName&“_Image WHERE”&tName&“Parent_ID ='”&imgID&“'”,SQLConn) – 2010-12-20 09:04:31