Search code examples
c#sqlimagesql-server-ce

Retrieving data of type SqlDbType.Image from SQL Server CE database


I have the following method i am using to save an object into an SQL Server CE database. I am now stuck on how to get the record back out.

public void SaveRecord(LabRecord _labrecord)
{
        try
        {
            conn = new SqlCeConnection(_connectionString);
            conn.Open();
            MemoryStream memStream = new MemoryStream();
            StreamWriter sw = new StreamWriter(memStream);

            sw.Write(_labrecord);

            SqlCeCommand sqlCmd = new SqlCeCommand("INSERT INTO LabTransactions([TrasactionType], [CAM], [TransactionObject]) VALUES ('ResultTest', 1234, @Image)", conn);

            sqlCmd.Parameters.Add("@Image",  SqlDbType.Image, Int32.MaxValue);

            sqlCmd.Parameters["@Image"].Value = memStream.GetBuffer();

            sqlCmd.ExecuteNonQuery();

        }
        finally
        {
            conn.Close();
        }
    }

Update

I am looking to make another class that returns a specific record.

public LabRecord getRecord(int transactionId)
{
        LabRecord returnRecord = null;

        try
        {
            conn = new SqlCeConnection(_connectionString);
            conn.Open();

            //.... Get the record
        }
        finally
        {
            conn.Close();
        }

        return returnRecord;
    }

Solution

  • I think the problem most likely lies in the fact that the size of the @Image parameter is being set to Int32.MaxValue

    Set it instead to the length of the image byte stream:

    byte[] imgBytes = memStream.GetBuffer();
    
    sqlCmd.Parameters.Add("@Image", SqlDbType.Image, imgBytes.Length);
    sqlCmd.Parameters["@Image"].Value = imgBytes;
    

    Here's an excerpt from this example (modified for your question) of how you might go about retrieving the image:

    // Get the record
    SqlCeCommand cmd = new SqlCeCommand("Select [TransactionObject] From LabTransactions Where [CAM] = 1234", conn);
    conn.Open();
    SqlCeDataReader sdr = cmd.ExecuteReader();
    byte[] imgByteData = Convert.ToByte(sdr.Item("Picture"));
    Bitmap bitmap = new Bitmap(new System.IO.MemoryStream(imgByteData));