Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用WPF将图像插入数据库_Sql_Wpf_Image_Insert - Fatal编程技术网

Sql 如何使用WPF将图像插入数据库

Sql 如何使用WPF将图像插入数据库,sql,wpf,image,insert,Sql,Wpf,Image,Insert,我有一个WPF问题 我有两个文本框和一个WPF格式的图像控件。 图像控件中有一个图像 我想在SQL数据库的3个独立列中插入每个文本框和图像的内容。 文本框输入到varchar列中,而图像本身加载到具有数据类型image的列中 我该怎么做 感谢制作2个表格,第一个表格包含textbox1的文本[可能是“名称”]、textbox2的文本[可能是“姓氏”]和imageId[],另一个表格包含文件id、文件字节和文件扩展名。当您用图片保存上述信息时。获取图像和扩展的字节并保存此文件。当您获得图像以便在某

我有一个WPF问题

我有两个文本框和一个WPF格式的图像控件。 图像控件中有一个图像

我想在SQL数据库的3个独立列中插入每个文本框和图像的内容。 文本框输入到varchar列中,而图像本身加载到具有数据类型image的列中

我该怎么做


感谢

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