2010-02-25 160 views
5

我有一個WPF問題的數據庫。如何將圖片插入使用WPF

我有2個文本框和在WPF形成圖像的控制。 圖像控件中有一個圖像。

我想插入每個文本框在3個單獨列的內容和圖像中的SQL數據庫。 將圖像本身加載到具有數據類型圖像的列中時,將文本框輸入到varchar列中。

我該怎麼做?

感謝

+0

有趣的問題! :) –

+2

不好的問題。 WPF的東西應該從數據庫中分離出來。 – arconaut

回答

0

化妝2表,第一個表包含TextBox1中的文字[也許 「名」],TextBox2中的文本[也許 「姓」]和圖像標識[],另一個表中包含文件ID,filebytes和文件extentions.when你用圖片保存上述信息。採取圖像的字節和擴展保存此。當你得到的圖像序某處顯示,你翻譯字節在這裏ASP.NET通過及其延伸的文件 http://www.beansoftware.com/ASP.NET-Tutorials/Save-Read-Image-Database.aspx 但控制一般都在.NET一樣。(textbox.Text等)

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

感謝這...它在正確的方向邁出的一步.. 是否有任何例子,我可以使用WPF數據綁定來做到這一點?我如何管理上述場景中的現場級驗證錯誤? 我正在使用SQL Compact作爲數據庫。 從我看到我必須manually地將每個控件的內容映射到數據庫,可能在SaveToDB方法中。 是否有任何其他整潔或更清潔的方式來實現我的目標,可能使用collectionviewsource或LINQ TO SQL? 謝謝 – femi

+0

也許這個網址會對你有好處http://www.aneef.net/2009/01/16/uploading-binary-files-or-images-using-linq-to-sql/ – ibrahimyilmaz

0

我不知道像字段類型是如何工作的,不過,這可能是有用的:

Image UriSource and Data Binding

換句話說,你可能需要使用值轉換器轉換到/從你的數據庫格式,以您的演示文稿(WPF)格式。

3

我們這樣做是爲了存儲圖像的數據庫中的斑點的方式(他們是相當小的圖像,4-500k,所以將它們存儲在數據庫中應該不會引起任何問題PERF),retreive他們爲字節數組,然後用ValueConverter轉換從byte[]BitMap。 的圖像控制的XAML看起來像這樣:

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

我們在視圖模型綁定到該屬性是一個簡單的byte[]這樣;

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

然後ValueConverte看起來像這樣;

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

下面介紹如何使用WPF中的Linq to SQL在數據庫中存儲/檢索圖像。

數據庫

我們推薦將圖像存儲在不同的表。 使用LINQ 2 SQL創建表,其中儲存圖像,

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

數據訪問層

在Visual Studio中添加型LINQ to SQL Classes.dbml)的一個新項目,讓稱之爲MyDataContext。 使用VS中的服務器資源管理器,連接到您的數據庫並將圖像UploadedImage的表格拖動到.dbml設計區域。保存MyDataContext文件Ctrl + 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> 

代碼背後

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