Sql 如何使用WPF将图像插入数据库
我有一个WPF问题 我有两个文本框和一个WPF格式的图像控件。 图像控件中有一个图像 我想在SQL数据库的3个独立列中插入每个文本框和图像的内容。 文本框输入到varchar列中,而图像本身加载到具有数据类型image的列中 我该怎么做Sql 如何使用WPF将图像插入数据库,sql,wpf,image,insert,Sql,Wpf,Image,Insert,我有一个WPF问题 我有两个文本框和一个WPF格式的图像控件。 图像控件中有一个图像 我想在SQL数据库的3个独立列中插入每个文本框和图像的内容。 文本框输入到varchar列中,而图像本身加载到具有数据类型image的列中 我该怎么做 感谢制作2个表格,第一个表格包含textbox1的文本[可能是“名称”]、textbox2的文本[可能是“姓氏”]和imageId[],另一个表格包含文件id、文件字节和文件扩展名。当您用图片保存上述信息时。获取图像和扩展的字节并保存此文件。当您获得图像以便在某
感谢制作2个表格,第一个表格包含textbox1的文本[可能是“名称”]、textbox2的文本[可能是“姓氏”]和imageId[],另一个表格包含文件id、文件字节和文件扩展名。当您用图片保存上述信息时。获取图像和扩展的字节并保存此文件。当您获得图像以便在某处显示时,您可以通过其扩展名将字节转换为文件 此处为ASP.NET,但控件在.NET中通常相同。(textbox.Text等)
我不确定图像字段类型是如何工作的,但是,这可能很有用:
换句话说,您可能需要使用值转换器将db格式转换为演示文稿(WPF)格式。如果您希望处理位图源图像,包括图像源不是文件的情况,我建议您先存储array+pixelformat和dimensions元数据(可以使用数组和元数据).我们这样做的方法是将图像作为BLOB存储在数据库中(它们是相当小的图像,4-500k,因此将它们存储在db中不会导致任何性能问题),将它们作为字节数组重新检索,然后使用
值转换器
将字节[]
转换为位图
。
图像控件的XAML如下所示:
<Image Source="{Binding Path=RawImageData,
Converter={StaticResource ByteArrayToBitmapImageConverter},
Mode=OneWay}" />
然后,ValueConverte
如下所示
private byte[] _rawImageData;
public byte[] RawImageData
{
get { return _rawImageData; }
set
{
if (value != _rawImageData)
{
_rawImageData = value;
NotifyPropertyChanged("RawImageData");
}
}
}
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();
}
}
下面介绍如何在WPF中使用Linq to 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]
使用Linq 2 SQL的数据访问层
<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>
在Visual Studio中,将类型为LINQ的新项添加到SQL类中(.dbml
),并将其称为MyDataContext
)。
在VS中使用服务器资源管理器,连接到数据库,并将图像表uploadeImage
拖动到.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>
谢谢你…这是朝着正确方向迈出的一步。。是否有任何示例可以使用WPF数据绑定来实现这一点?在上述场景中,我将如何管理字段级验证错误?我使用SQL Compact作为数据库。从我看到的情况来看,我必须手动将每个控件的内容映射到数据库,可能是在SaveToDB方法中。是否有其他更简洁或更干净的方法来实现我的目标,可能使用collectionviewsource或LINQtoSQL?谢谢,也许这个网址对你有好处,坏问题。WPF内容应与DB内容分开。
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));
}
}