将上载的位图转换为字节数组并存储在SQL Server中

时间:2016-05-25 13:59:12

标签: c# sql-server bitmap

我正在尝试构建一个允许用户选择图像的应用程序,然后再上传到SQL服务器表中。

问题是存储的数据似乎不完整。我试图通过一个在线转换器(即http://www.lokowebdesign.com/imagetobinary/),但收到一个错误,指出它不是一个可识别的格式。

因为它存储在表中,所以数据如下所示:

0xFFD8FFE000104A46494600010201006000600000FFEE000E41646F626500640000000001FFE10DDE4578696600004D4D002A000000080006013200020000001400000056013B00020000000B0000006A47460003000000010005000047490003000000010058000082980002000000160000007687690004000000010000008C

以下是一些相关的代码段:

//表的定义,Grid

  DataTable grid = new DataTable("Grid");
        grid.Columns.Add("ID", typeof(int));
        grid.Columns.Add("Description", typeof(String));
        grid.Columns.Add("Points", typeof(int));
        grid.Columns.Add("Score", typeof(List<int>));
        grid.Columns.Add("Current", typeof(int));
        grid.Columns.Add("Comments", typeof(List<String>));
        grid.Columns.Add("SelectedComment", typeof(int));
        grid.Columns.Add("SelectedCommentText", typeof(String));
        grid.Columns.Add("Category", typeof(int));
        grid.Columns.Add("SelectedScore", typeof(int));
        grid.Columns.Add("Image", typeof(byte[]));

// report_details table

insert = new SqlCommand("INSERT into dbo.report_details (reportID, itemID, points, comments, image) " + " VALUES (@reportID, @itemID, @points, @comments, @image)", con);
            insert.Parameters.Add("@reportID", SqlDbType.Char, 5, "reportID");
            insert.Parameters.Add("@itemID", SqlDbType.Int, 5, "itemID");
            insert.Parameters.Add("@points", SqlDbType.Int, 4, "points");
            insert.Parameters.Add("@comments", SqlDbType.Text, 150, "comments");
            insert.Parameters.Add("@image", SqlDbType.Image, (int)Math.Pow(2, 20), "image");

//基于DataGrid绑定表Grid

更新report_details(在数据库中)
  foreach (DataRow row in ds.Tables["Grid"].Rows)
        {

            DataRow reportDetailsRow = ds.Tables["Details"].NewRow();

           reportDetailsRow["reportID"] = id;
            reportDetailsRow["itemID"] = row["ID"];
            reportDetailsRow["points"] = row["Current"];

            List<String> comments = (List<String>)row["Comments"];


            reportDetailsRow["comments"] = row["SelectedCommentText"];
            if (row["Image"] != null)
            {


                reportDetailsRow["image"] = row["Image"];
            }

            ds.Tables["Details"].Rows.Add(reportDetailsRow);

        }

        detailsAdapter.Update(ds, "Details");
        tran.Commit();


    }

//当用户点击按钮附加图片时调用

    private async void uploadImage(Object sender, RoutedEventArgs e)
    {
        Bitmap photo = null;

        // this is for tablets

try
        {
            capturePhoto capture = new capturePhoto();
            photo = await capture.getImage();


        }
        catch (Exception ex)
        {

// this is what I am actually using for testing 

            OpenFileDialog fileDialog = new OpenFileDialog();

            if (fileDialog.ShowDialog() == true)
            {
                photo = (Bitmap)Bitmap.FromStream(fileDialog.OpenFile());
            }

        }

        DataRowView row = (DataRowView)itemGrid.CurrentItem;
        ImageConverter converter = new ImageConverter();
        byte[] photoBytes = (byte[])converter.ConvertTo(photo, typeof(byte[])); ;
        row["Image"] = photoBytes;


    }

    }

我真的希望我提供了足够的细节,但如果需要可以提供更多。这对我来说是一个非常棘手的问题,所以我非常感谢任何指导。非常感谢!

编辑:我尝试了以下内容,同样的问题仍然存在:

 private async void uploadImage(Object sender, RoutedEventArgs e)
        {
            Bitmap photo = null;

            try
            {
                capturePhoto capture = new capturePhoto();
                photo = await capture.getImage();


            }
            catch (Exception ex)
            {
                OpenFileDialog fileDialog = new OpenFileDialog();

                if (fileDialog.ShowDialog() == true)
                {
                    photo = (Bitmap)Bitmap.FromStream(fileDialog.OpenFile());
                }

            }

            DataRowView row = (DataRowView)itemGrid.CurrentItem;
           //  ImageConverter converter = new ImageConverter();
            // byte[] photoBytes = (byte[])converter.ConvertTo(photo, typeof(byte[])); ;
            MemoryStream mem = new MemoryStream();
            using (mem)
            {
                photo.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
                row["Image"] = mem.ToArray();
            }
           //  row["Image"] = photoBytes;


        }

        }

1 个答案:

答案 0 :(得分:1)

首先,根据this MSDN article

  将来的MicrosoftSQL Server版本中将删除

ntext 文本图像数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max),varchar(max)和varbinary(max)。

我不确定图像列类型是否存在奇怪的格式,但您发布的示例数据几乎 base64,但它的长度无效。您在编辑中发布的用于保存图像的代码对我来说是正确的,因此要测试此理论,您可以将图像转换为base64并与您在数据库中看到的进行比较:

var data = mem.ToArray();
var base64 = Convert.ToBase64(data);