无法通过Windows窗体应用程序中的SQL Server数据库在图片框控件中显示图像

问题描述

我想从我的C#Windows窗体应用程序将扫描的图像(车辆文档)添加sql Server数据库中。在sql Server数据库中,将要保存扫描文档的列的数据类型为Image,我想将图像存储为每个扫描文档的数组。这是我的代码,将数据保存到sql Server数据库中。

浏览按钮代码

        private void btnbrowseFiles_Click(object sender,EventArgs e)
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Filter = "image files|*.jpg;*.png;*.gif;*.icon;*.bmp;*.*";
            DialogResult dResult = fileDialog.ShowDialog();

            if (dResult == DialogResult.OK)
            {
                pBoxVehicleDocument.Image = Image.FromFile(fileDialog.FileName);
            }
        }

添加按钮代码

private void btnAdd_Click(object sender,EventArgs e)
{
    string documentName,vehicleId;
    documentName = txtDocumentName.Text;
    vehicleId = lblVehicleId.Text;
    
    MemoryStream mStream = new MemoryStream();
    pBoxDocument.Image.Save(mStream,System.Drawing.Imaging.ImageFormat.Jpeg);
    mStream.ToArray();

    //The documentName,vehicleId and imageArray to be passed to AddVehicleDocuments Method within Vehicles Class.

    //No I am getting invalid arguments exception on AddVehicleDocuments() method.
    Vehicles.AddVehicleDocuments(documentName,vehicleId,imageArray);
}

最后是Vehicles类中的AddVehicleDocuments方法代码

public static void AddVehicleDocuments(string documentName,int vehicleId,byte[] imageString)
        {
            string query = string.Format("insert into tblDocuments values ('{0}',{1},{3})",documentName,imageString);
            DataAccess.Execute(query);
        }

现在,以下代码用于图像选择。我不确定如何将数组值从数据库转换回Windows窗体上的图片框:

private void childDocumentDetails_Load(object sender,EventArgs e)
{
    int documentId = Convert.ToInt32(lblDocumentId.Text);
    DaTarow dr = Vehicles.GetDocumentDetailsById(documentId);

    txtDocumentName.Text = dr["DocumentName"].ToString();
    txtVehicleNo.Text = dr["VehicleNo"].ToString();
    //here the image array from the database will locate in dr["VehicleDocument"];
    

    pBoxDocument.Image = //Need to write my code here
}

DaTarow dr包含给定文档的所有三个记录,即DocumentName,VehicleNo / VehicleID和字节字符串,但是Picture Box控件仍然不显示目标图像。在这方面只需要一些专家建议即可。

我们将不胜感激任何帮助。

解决方法

因为根据我的研究,我确定SQL Server-Side上的Image数据类型将对我有用,以便为车辆存储扫描的文档。但是,我后来修改了代码,并使用Verbinary(MAX)作为用于在数据库中存储图像的数据类型。

我修改了插入代码,现在看起来像这样:

private void btnAdd_Click(object sender,EventArgs e)
{
    string documentName,vehicleId;
    documentName = txtDocumentName.Text;
    vehicleId = lblVehicleId.Text;
    
    MemoryStream mStream = new MemoryStream();
    pBoxDocument.Image.Save(mStream,System.Drawing.Imaging.ImageFormat.Jpeg);
    byte[] imagesBytes = mStream.ToArray();

    Vehicles.AddVehicleDocuments(documentName,vehicleId,imagesBytes);
}

图像选择代码如下:

private void childDocumentDetails_Load(object sender,EventArgs e)
{
    int documentId = Convert.ToInt32(lblDocumentId.Text);
    DataRow dr = Vehicles.GetDocumentDetailsById(documentId);

    txtDocumentName.Text = dr["DocumentName"].ToString();
    txtVehicleNo.Text = dr["VehicleNo"].ToString();
    byte[] imageString = (byte[]dr["VehicleDocument"]);
    MemoryStream mStream = new MemoryStream(imageString);

    pBoxDocument.Image = Image.FromStream(mStream);
}

感谢@Jimi建议修改代码。