Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL将图像下载到图片框';内存不足';错误_Sql_Sql Server_Vb.net_Image_Sql Server 2008 - Fatal编程技术网

SQL将图像下载到图片框';内存不足';错误

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

*strong text*好的,我有一个测试应用程序,它只是测试向SQL Server上传和下载图像的过程。上载代码可以工作,但当我尝试从SQL Server检索图像时,收到一个“内存不足”错误。但是,当我将picturebox从
.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)

其他信息:

  • 由于
    Members\u ID
    是主键,因此只需要1行
  • SQL Server是MS SQL Server+Management Studio
  • DP
    列的格式为“Image”,并按如下方式存储图片:
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