SQL将图像下载到图片框';内存不足';错误
*strong text*好的,我有一个测试应用程序,它只是测试向SQL Server上传和下载图像的过程。上载代码可以工作,但当我尝试从SQL Server检索图像时,收到一个“内存不足”错误。但是,当我将picturebox从SQL将图像下载到图片框';内存不足';错误,sql,sql-server,vb.net,image,sql-server-2008,Sql,Sql Server,Vb.net,Image,Sql Server 2008,*strong text*好的,我有一个测试应用程序,它只是测试向SQL Server上传和下载图像的过程。上载代码可以工作,但当我尝试从SQL Server检索图像时,收到一个“内存不足”错误。但是,当我将picturebox从.BackGroundImage更改为仅.Image时,代码工作正常 我需要的图像是在一个BackGoundImage格式,以便我可以很容易地改变图像的大小(中心,拉伸等) 错误: 发生“System.OutOfMemoryException”类型的未处理异常 在Sys
.BackGroundImage
更改为仅.Image
时,代码工作正常
我需要的图像是在一个BackGoundImage格式,以便我可以很容易地改变图像的大小(中心,拉伸等)
错误:
发生“System.OutOfMemoryException”类型的未处理异常
在System.Drawing.dll中
其他信息:内存不足
从SQL Server检索映像的代码为:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'Retrieve Image
GroupBox2.BringToFront()
GroupBox2.Visible = True
Label1.Visible = False
TextBox1.Visible = False
con.Open()
Dim cmd As New SqlCommand("SELECT DP FROM PersonsA WHERE Members_ID = 1", con)
cmd.CommandType = CommandType.Text
Dim ImgStream As New IO.MemoryStream(CType(cmd.ExecuteScalar, Byte()))
PictureBox2.BackgroundImage = Image.FromStream(ImgStream, False, True)
ImgStream.Dispose()
con.Close()
End Sub
错误突出显示了PictureBox2.BackgroundImage=Image.FromStream(ImgStream,False,True)
行
其他信息:
- 由于
是主键,因此只需要1行李>Members\u ID
- SQL Server是MS SQL Server+Management Studio李>
列的格式为“Image”,并按如下方式存储图片:DP
0xFFD8FF000104A46494600010201000000000000000FF
这是上传图像代码(正常)
导入和Dims
Imports System.Data.SqlClient
Imports System.IO
Public Class Form1
'path variable use for Get application running path
Dim path As String = (Microsoft.VisualBasic.Left(Application.StartupPath, Len(Application.StartupPath) - 9))
Dim con As New SqlConnection("CONNECTION_STRING;")
Dim cn As New SqlConnection("CONNECTION_STRING;")
Dim cmd As SqlCommand
你知道我为什么会收到“内存不足错误”吗?这个程序很小,不需要使用过多的RAM,所以它必须和我的代码在一起
[编辑1]
以下Jaques非常有用的建议我将代码改为以下内容-注意有两个错误,因为read没有声明-应该声明为什么
Dim cmd As New SqlCommand("SELECT DP FROM PersonsA WHERE Members_ID = 1", con)
cmd.CommandType = CommandType.Text
Dim Buffersize As Integer = 4096
Dim retval As Long = 0
Dim TempLen1 As Long = 0
Dim startindex As Long = 0
Dim reference_temp As [Byte]() = New [Byte](4095) {}
Dim RefTemp As New List(Of Byte)()
Dim Read As
retval = read.GetBytes(0, startindex, reference_temp, 0, buffersize)
'0 is the first Column
TempLen1 += retval
While retval = buffersize
RefTemp.AddRange(reference_temp)
startindex += buffersize
retval = read.GetBytes(0, startindex, reference_temp, 0, buffersize)
TempLen1 += retval
End While
RefTemp.AddRange(reference_temp)
Dim Reference_temp1 As Byte() = RefTemp.GetRange(0, CInt(TempLen1)).ToArray()
End Sub
[编辑2]
我现在在retval-read.GetBytes(16,startindex
…行上收到一个错误
“System.InvalidOperationException”类型的未处理异常
发生在Microsoft.VisualBasic.dll中
其他信息:没有数据时读取的尝试无效
现在
到目前为止,我的代码是:
'Retrieve Image
GroupBox2.BringToFront()
GroupBox2.Visible = True
Label1.Visible = False
TextBox1.Visible = False
con.Open()
Dim cmd As New SqlCommand("SELECT DP FROM PersonsA WHERE Members_ID = 1", con)
cmd.CommandType = CommandType.Text
Dim read = cmd.ExecuteReader
Dim Buffersize As Integer = 4096
Dim retval As Long = 0
Dim TempLen1 As Long = 0
Dim startindex As Long = 0
Dim reference_temp As [Byte]() = New [Byte](4095) {}
Dim RefTemp As New List(Of Byte)()
retval = read.GetBytes(16, startindex, reference_temp, 16, Buffersize)
'0 is the first Column
TempLen1 += retval
While retval = buffersize
RefTemp.AddRange(reference_temp)
startindex += buffersize
retval = read.GetBytes(16, startindex, reference_temp, 16, Buffersize)
TempLen1 += retval
End While
RefTemp.AddRange(reference_temp)
Dim Reference_temp1 As Byte() = RefTemp.GetRange(16, CInt(TempLen1)).ToArray()
Dim ImgStream As New IO.MemoryStream(Reference_temp1)
PictureBox2.BackgroundImage = Image.FromStream(ImgStream, False, True)
ImgStream.Dispose()
为什么不使用数据读取器中的GetBytes,比如(它的C#,但我相信您可以转换为:) 将其转换为VB:
int buffersize = 4096;
long retval = 0;
long TempLen1 = 0;
long startindex = 0;
Byte[] reference_temp = new Byte[4096];
List<byte> RefTemp = new List<byte>();
retval = read.GetBytes(0, startindex, reference_temp, 0, buffersize); //0 is the first Column
TempLen1 += retval;
while (retval == buffersize)
{
RefTemp.AddRange(reference_temp);
startindex += buffersize;
retval = read.GetBytes(0, startindex, reference_temp, 0, buffersize);
TempLen1 += retval;
}
RefTemp.AddRange(reference_temp);
byte[] Reference_temp1 = RefTemp.GetRange(0, (int)TempLen1).ToArray();
我要感谢Jaques为帮助我所做的努力。解决方案比这个答案简单一点——这仍然会导致“内存不足”错误。但是,我们非常赞赏所作的努力。最后,这段代码没有任何错误 '检索图像 GroupBox2.BringToFront() GroupBox2.Visible=True Label1.Visible=False TextBox1.Visible=False 将流变暗为新内存流()
是的,但我如何将其放入代码中,以便它使用SQL映像并将其输出到图片框?我已将我的代码“添加”到您的代码中。将C#部分按原样转换为VB,它应该可以工作。嗨,我真的很感谢你的帮助。我将您的代码转换为vb.net,在read.GetBtyes行中留下了两个错误。它说的是>“读取未声明”。请注意,我在代码的末尾添加了一行
Dim Read=cmd.ExecuteDataReader()代码>您需要添加它。在声明之后添加一个if(read.HasRows)
可能是明智的,这样当没有行时,就不会出现异常。我编辑了答案是的,我自己想出来的。你能看一下我的第二次编辑吗?我添加了一个新错误的最新代码我可能没有正确地构造它。如果您得到一个OutOfMemoryException
,通常是因为您的进程是32位的,并且已经分配了所有可寻址的2GB内存,或者它已经用完了所有的系统句柄或GDI句柄。无论哪种方式,您都可以通过观察任务管理器来判断。由于错误发生在System.Drawing.dll中,我强烈怀疑您的GDI句柄不足。每个进程限制为10000个GDI对象。理想情况下,您的流程应该不会接近该限制。
'Retrieve Image
GroupBox2.BringToFront()
GroupBox2.Visible = True
Label1.Visible = False
TextBox1.Visible = False
con.Open()
Dim cmd As New SqlCommand("SELECT DP FROM PersonsA WHERE Members_ID = 1", con)
cmd.CommandType = CommandType.Text
Dim read = cmd.ExecuteReader();
if(read.HadRows) then
read.Read() 'Reads the first record from the DataReader
int buffersize = 4096;
long retval = 0;
long TempLen1 = 0;
long startindex = 0;
Byte[] reference_temp = new Byte[4096];
List<byte> RefTemp = new List<byte>();
retval = read.GetBytes(0, startindex, reference_temp, 0, buffersize); //0 is the first Column
TempLen1 += retval;
while (retval == buffersize)
{
RefTemp.AddRange(reference_temp);
startindex += buffersize;
retval = read.GetBytes(0, startindex, reference_temp, 0, buffersize);
TempLen1 += retval;
}
RefTemp.AddRange(reference_temp);
byte[] Reference_temp1 = RefTemp.GetRange(0, (int)TempLen1).ToArray();
Dim ImgStream As New IO.MemoryStream(Reference_temp1)
PictureBox2.BackgroundImage = Image.FromStream(ImgStream, False, True)
ImgStream.Dispose()
EndIf
con.Open()
Dim cmd As New SqlCommand("SELECT DP FROM PersonsA WHERE Members_ID = 1", con)
cmd.CommandType = CommandType.Text
Dim image As Byte() = DirectCast(cmd.ExecuteScalar(), Byte())
Stream.Write(image, 0, image.Length)
con.Close()
Dim bitmap As New Bitmap(stream)
PictureBox2.BackgroundImage = bitmap
PictureBox2.BackgroundImageLayout = ImageLayout.Stretch