2010-02-25 33 views
5

Tengo una pregunta de WPF.cómo insertar una imagen en una base de datos usando WPF

Tengo 2 cuadros de texto y un control de imagen en un formulario WPF. El control de imagen tiene una imagen.

Quiero insertar el contenido de cada uno de los cuadros de texto y la imagen en las 3 columnas separadas en una base de datos SQL. Los cuadros de texto se cargan en columnas varchar mientras que la imagen se carga en una columna con una imagen de tipo de datos.

¿Cómo puedo hacer esto?

Gracias

+0

Niza pregunta! :) –

+2

Mala pregunta. Las cosas de WPF deben separarse de las cosas de DB. – arconaut

Respuesta

0

marca 2 de mesa, primera tabla contiene el texto de TextBox1 [tal vez "name"], el texto de TextBox2 [tal vez "apellido"] y ImageID [], otra tabla contiene el ID de archivo, filebytes y extentions.when archivo guarda la información mencionada con la imagen. tomar bytes de imagen y extensión guardar esto. cuando llegue a la imagen finde para mostrar alguna parte, a traducir byte a presentar a través de su extensión http://www.beansoftware.com/ASP.NET-Tutorials/Save-Read-Image-Database.aspx aquí para ASP.NET pero los controles son generalmente iguales en .NET. (TextBox.Text etc.)

private void Button1_Click(object sender, System.EventArgs e) 
{ 
Stream img_strm = upload_file.PostedFile.InputStream; 

//Retrieving the length of the file to upload 
int img_len = upload_file.PostedFile.ContentLength; 
//retrieving the type of the file to upload 
string strtype = upload_file.PostedFile.ContentType.ToString(); 
string strname = txtimgname.Text.ToString(); 
byte[] imgdata = new byte[img_len]; 
int n = img_strm.Read(imgdata, 0, img_len); 
int result = SaveToDB(strname, imgdata, strtype);} 
+0

gracias por esto ... es un paso en la dirección correcta ... ¿Hay algún ejemplo en el que pueda usar enlaces de datos WPF para hacer esto? ¿Cómo administraré los errores de validaciones de nivel de campo en el escenario anterior? uso SQL Compact como base de datos. Por lo que veo, tengo que mapear manualmente el contenido de cada control a la base de datos, posiblemente en el método SaveToDB. ¿Hay alguna otra manera más clara o más limpia de lograr mi objetivo, posiblemente utilizando collectionviewsource o LINQ TO SQL? Gracias – femi

+0

tal vez este será útil para usted http://www.aneef.net/2009/01/16/uploading-binary-files-or-images-using-linq-to-sql/ – ibrahimyilmaz

0

no estoy seguro de cómo funciona el tipo de campo de imagen, sin embargo, esto podría ser útil:

Image UriSource and Data Binding

En otras palabras, es posible que tenga que utilizar un convertidor de valores para convertir a/desde el formato db a su formato de presentación (WPF).

0

Si desea gestionar las imágenes BitmapSource incluyendo los casos en los que las fuentes de las imágenes no son archivos, entonces me recomiendan copying the pixels' buffer into an array, a continuación, almacenar la matriz + PixelFormat y las dimensiones de metadatos (matriz y los metadatos pueden ser uso de recreate the image).

3

La forma en que lo hacemos es almacenar las imágenes como blobs en la base de datos (son imágenes bastante pequeñas, 4-500k, por lo que almacenarlas en la base de datos no debería causar ningún problema de perfusión), recuperarlas como byte arrays, y luego use un ValueConverter para convertir de byte[] a BitMap. El XAML para el control de la imagen se ve así:

<Image Source="{Binding Path=RawImageData, 
         Converter={StaticResource ByteArrayToBitmapImageConverter}, 
         Mode=OneWay}" /> 

La propiedad que se unen a en el modelo de vista es simplemente una byte[] como esto;

private byte[] _rawImageData; 
public byte[] RawImageData 
{ 
    get { return _rawImageData; } 
    set 
    { 
     if (value != _rawImageData) 
     { 
      _rawImageData = value; 
      NotifyPropertyChanged("RawImageData"); 
     } 
    } 
} 

Y entonces el ValueConverte se parece así;

public class ByteArrayToBitmapImageConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
     var rawImageData = value as byte[]; 
     if (rawImageData == null) 
      return null; 

     var bitmapImage = new System.Windows.Media.Imaging.BitmapImage(); 
     using (var stream = new MemoryStream(rawImageData)) 
     { 
      bitmapImage.BeginInit(); 
      bitmapImage.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
      bitmapImage.CacheOption = BitmapCacheOption.Default; 
      bitmapImage.StreamSource = stream; 
      bitmapImage.EndInit(); 
     } 
     return bitmapImage; 
     } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 
1

A continuación una forma de cómo almacenar/recuperar imágenes en una base de datos utilizando Linq a SQL en WPF.

base de datos

Se recomienda almacenar las imágenes en tablas separadas. Crear la tabla donde almacenar las imágenes,

CREATE TABLE UploadedImage(
[ImageID] [int] IDENTITY(1,1) NOT NULL, 
[ImageName] [varchar](100) NOT NULL, 
[ImageContent] [image] NOT NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

capa de acceso a datos utilizando Linq 2 SQL

En Visual Studio agrega un nuevo elemento de tipo LINQ to SQL Classes (.dbml) y permite llamarlo MyDataContext. Use Server Explorer en VS, conéctese a su base de datos y arrastre la tabla de sus imágenes UploadedImage al área de diseño .dbml. Guarde el archivo MyDataContextCtrl + S.

XAML

<TextBox x:Name="ImagePath" /> 
<Button x:Name="BrowseButton" Content="..." Click="BrowseButton_OnClick"/> 
<Button x:Name="SaveButton" Content="Save" Click="SaveButton_OnClick"/> 
<Button x:Name="LoadButton" Content="Load" Click="LoadButton_OnClick" /> 
<Image x:Name="MyImage" > 
    <Image.Source> 
     <BitmapImage UriSource="{Binding ElementName=ImagePath, Path=Text}" /> 
    </Image.Source> 
</Image> 

Código detrás

private byte[] _imageBytes = null; 

// Browse for an image on your computer 
private void BrowseButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    var dialog = new OpenFileDialog 
    { 
     CheckFileExists = true, 
     Multiselect = false, 
     Filter = "Images (*.jpg,*.png)|*.jpg;*.png|All Files(*.*)|*.*" 
    }; 

    if (dialog.ShowDialog() != true) { return; } 

    ImagePath.Text = dialog.FileName; 
    MyImage.Source = new BitmapImage(new Uri(lImagePath.Text)); 

    using (var fs = new FileStream(ImagePath.Text, FileMode.Open, FileAccess.Read)) 
    { 
     _imageBytes = new byte[fs.Length]; 
     fs.Read(imgBytes, 0, System.Convert.ToInt32(fs.Length)); 
    } 
} 

// Save the selected image to your database 
private void SaveButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    if (!String.IsNullOrEmpty(ImagePath.Text)) 
    { 
     var db = new MyDataContext(); 
     var uploadedImg = new UploadedImage 
     { 
      ImageID = 0, 
      ImageContent = _imageBytes, 
      ImageName = ImagePath.Text 
     }; 

     db.UploadedImages.InsertOnSubmit(uploadedImg); 
     db.SubmitChanges(); 
    } 
} 

// Load an image from the database 
private void LoadButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    // Load 1 image from the database and display it 
    var db = new ImageInDatabaseDataContext(); 
    var img = (from el in db.UploadedImages 
     select el).FirstOrDefault(); 


    if (img != null) 
    { 
     // Display the loaded image 
     ImageFile.Source = new BitmapImage(new Uri(img.ImageName)); 
    } 
} 
Cuestiones relacionadas