从C#将二进制映像保存到SqlServer 2014中

时间:2017-09-12 07:54:12

标签: c# sql-server

我有下面的代码c#的问题,我应该在sql server数据库2014中保存二进制图像,我做了将图像转换为二进制的功能,图像用按钮选择它,问题是当我在 Immagine 字段中将数据库保存到0x00,如何修复此类错误? Immagine 字段格式为二进制

QUERY:

private void buttonCaricaImmagine_Click(object sender, EventArgs e)
{            
    OpenFileDialog of = new OpenFileDialog();
    //For any other formats

     of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png)|*.BMP;*.JPG;*.JPEG;*.PNG";
    if (of.ShowDialog() == DialogResult.OK)
    {

        pictureBoxRapportino.ImageLocation = of.FileName;
        imm = pictureBoxRapportino.Image;
        checkImage = 1;
    }
}

public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
    ImageConverter _imageConverter = new ImageConverter();
    byte[] xByte = (byte[])_imageConverter.ConvertTo(imageIn, typeof(byte[]));
    return xByte;
}

private void buttonInserimento_Click(object sender, EventArgs e)
{
    try
    {
        if(checkImage==1 && textBoxNumeroDocumento.Text != "")
        {
            //controlla dati
            int NumeroDocumento = int.Parse(textBoxNumeroDocumento.Text);

             byte[] ImmagineBinaria = ImageToByteArray(imm);
             string BinaryImageCast = Encoding.UTF8.GetString(ImmagineBinaria);
             //MessageBox.Show("Immagine in formato binario: " + BinaryImageCast);

            //inserisco i dati nel database
            SqlConnection conn = db.apriconnessione();

            String query = "Insert into Rapporto(IdCantiere,IdUtenteCreazione,NumeroDocumento,Data,Immagine) values(@IdCantiere,@IdUtenteCreazione,@NumeroDocumento,@Data,@Immagine) ";

            using (SqlCommand command = new SqlCommand(query, conn))
            {                       
                command.Parameters.Add("@IdCantiere", SqlDbType.Int).Value = IdCantiere;
                command.Parameters.Add("@IdUtenteCreazione", SqlDbType.Int).Value = u.IdUtente;
                command.Parameters.Add("@NumeroDocumento", SqlDbType.Int).Value = int.Parse(textBoxNumeroDocumento.Text);
                command.Parameters.Add("@Data", SqlDbType.DateTime).Value = dateTimePickerData.Value;
                command.Parameters.Add("@Immagine", SqlDbType.Binary).Value = ImmagineBinaria;
                command.ExecuteNonQuery();

            }

            db.chiudiconnessione();
            conn.Close();

        }

        else
        {
            MessageBox.Show("Devi compilare tutti i campi");
        }



    }

    catch(Exception ex)
    {
        MessageBox.Show("Errore: controlla i formati "+ex);
    }

}

数据库Sql Server: enter image description here

表架构

CREATE TABLE Rapporto(
    IdRapporto int IDENTITY(1,1) PRIMARY KEY,
    IdCantiere int FOREIGN KEY REFERENCES Cantiere(IdCantiere),
    IdUtenteCreazione int FOREIGN KEY REFERENCES Utente(IdUtente),
    NumeroDocumento varchar(5000) default NULL,
    Data datetime default NULL,
    Immagine varbinary(MAX) default NULL,

); 

1 个答案:

答案 0 :(得分:2)

试试这个使用conv_photo()这会对你有帮助。

  private void buttonCaricaImmagine_Click(object sender, EventArgs e)
            {
                OpenFileDialog of = new OpenFileDialog();
                //For any other formats

                of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png)|*.BMP;*.JPG;*.JPEG;*.PNG";
                if (of.ShowDialog() == DialogResult.OK)
                {

                    pictureBoxRapportino.ImageLocation = of.FileName;
                    imm = pictureBoxRapportino.Image;
                    checkImage = 1;
                }
            }
            //this will convert your picture and save in database
            void conv_photo()
            {
                MemoryStream ms;
                if (pictureBoxRapportino.Image != null)
                {
                    ms = new MemoryStream();
                    pictureBoxRapportino.Image.Save(ms, ImageFormat.Jpeg);
                    byte[] photo_aray = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(photo_aray, 0, photo_aray.Length);
                    command.Parameters.Add("@Immagine", SqlDbType.Binary).Value = photo_aray;
                }
            }



            private void buttonInserimento_Click(object sender, EventArgs e)
            {
                try
                {
                    if (checkImage == 1 && textBoxNumeroDocumento.Text != "")
                    {
                        //controlla dati
                        int NumeroDocumento = int.Parse(textBoxNumeroDocumento.Text);

                        //inserisco i dati nel database
                        SqlConnection conn = db.apriconnessione();

                        String query = "Insert into Rapporto(IdCantiere,IdUtenteCreazione,NumeroDocumento,Data,Immagine) values(@IdCantiere,@IdUtenteCreazione,@NumeroDocumento,@Data,@Immagine) ";

                        using (SqlCommand command = new SqlCommand(query, conn))
                        {
                            command.Parameters.Add("@IdCantiere", SqlDbType.Int).Value = IdCantiere;
                            command.Parameters.Add("@IdUtenteCreazione", SqlDbType.Int).Value = u.IdUtente;
                            command.Parameters.Add("@NumeroDocumento", SqlDbType.Int).Value = int.Parse(textBoxNumeroDocumento.Text);
                            command.Parameters.Add("@Data", SqlDbType.DateTime).Value = dateTimePickerData.Value;
                            conv_photo();
                            command.ExecuteNonQuery();

                        }

                        db.chiudiconnessione();
                        conn.Close();

                    }

                    else
                    {
                        MessageBox.Show("Devi compilare tutti i campi");
                    }

                }

                catch (Exception ex)
                {
                    MessageBox.Show("Errore: controlla i formati " + ex);
                }

            }