2010-02-25 12 views
5

Ho una domanda WPF.come inserire un'immagine in un database utilizzando WPF

Ho 2 caselle di testo e un controllo immagine in un modulo WPF. Il controllo dell'immagine ha un'immagine al suo interno.

Desidero inserire il contenuto di ciascuna casella di testo e l'immagine nelle 3 colonne separate in un database SQL. Le caselle di testo si inseriscono in colonne varchar mentre l'immagine stessa viene caricata in una colonna con l'immagine del tipo di dati.

Come posso fare questo?

Grazie

+0

Nizza domanda! :) –

+2

Cattiva domanda. Le cose di WPF dovrebbero essere separate da quelle di DB. – arconaut

risposta

0

make 2 tavolo, prima tabella contiene il testo di textbox1 [forse "nome"], il testo di TextBox2 [forse "cognome"] e ImageID [], un'altra tabella contiene file di ID, filebytes e extentions.when di file si salva le informazioni di cui sopra con l'immagine. prendere byte di immagine ed estensione, salvare questo. quando si ottiene l'immagine inorder per mostrare qualche parte, si traduce byte di file attraverso la sua estensione http://www.beansoftware.com/ASP.NET-Tutorials/Save-Read-Image-Database.aspx qui per ASP.NET, ma i controlli sono generalmente uguali in .net. (TextBox.Text ecc)

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

grazie per questo ... è un passo nella giusta direzione .. Ci sono degli esempi in cui posso utilizzare i binding di dati WPF per fare questo? come gestirò gli errori di validazione a livello di campo nello scenario sopra descritto? sto usando SQL Compact come database. Da quello che vedo devo mappare manualmente il contenuto di ogni controllo alla base dati, possibilmente nel metodo SaveToDB. C'è qualche altro modo più ordinato o più pulito per raggiungere il mio scopo, possibilmente utilizzando collectionviewsource o LINQ TO SQL? Grazie – femi

+0

forse questo ti farà bene http://www.aneef.net/2009/01/16/uploading-binary-files-or-images-using-linq-to-sql/ – ibrahimyilmaz

0

non sono sicuro di come funziona il tipo di campo immagine, tuttavia, questo potrebbe essere utile:

Image UriSource and Data Binding

In altre parole, potrebbe essere necessario utilizzare un convertitore di valore da convertire da/per il formato db al tuo formato di presentazione (WPF).

0

Se si desidera gestire le immagini BitmapSource compresi i casi in cui le fonti delle immagini non sono file, allora vi consiglio copying the pixels' buffer into an array, quindi memorizzare l'array + PixelFormat e le dimensioni dei metadati (array e metadati possono essere utilizzare per recreate the image).

3

Il modo in cui lo facciamo è quello di memorizzare le immagini come macchie nel database (sono abbastanza piccole immagini, 4-500k, quindi riporli nel db non dovrebbe causare alcun problema perf), li retreive come byte array e quindi utilizzare un ValueConverter per convertire da byte[] a BitMap. Il XAML per il controllo immagine è simile al seguente:

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

La proprietà che si legano al nel ViewModel è semplicemente un byte[] come questo;

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

E quindi il ValueConverte si presenta così;

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

Sotto un modo di come memorizzare/recuperare le immagini in un database utilizzando LINQ to SQL in WPF.

Database

Si consiglia di memorizzare le immagini in tabelle separate. Creare la tabella in cui archiviare le foto,

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

strato di accesso ai dati utilizzando Linq 2 SQL

In Visual Studio aggiungere un nuovo elemento di tipo LINQ to SQL Classes (.dbml) e permette di chiamare MyDataContext. Utilizzare Server Explorer in VS, connettersi al database e trascinare la tabella delle immagini UploadedImage nell'area di disegno .dbml. Salvare il file 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> 

codice dietro

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)); 
    } 
} 
Problemi correlati