如何从sqlite读取blob返回到字节数组?
本文关键字:返回 到字节 数组 blob 读取 sqlite | 更新日期: 2023-09-27 18:14:03
我有一个OpenFileDialog,允许用户选择一个。png图像。我将其存储到一个属性中,如下所示:
public byte[] HeroesDBThumbnailImage ...
...
if(OFD.ShowDialog() == true)
{
HeroesDBThumbnailImage = File.ReadAllBytes(OFD.FileName);
HeroesDBThumbnailPath = OFD.SafeFileName;
}
一旦在那里设置了值,我将按如下方式向DB插入条目:
query = ....blahblah...
query += "'" Convert.ToBase64String(HeroesDBThumbnailImage) + "','" + Convert.ToBase64String(HeroesDBFeaturedThumbnailImage) + "'); ";
它似乎在向DB插入数据,所以我很高兴。
然后,我把它读回如下:
new Hero(
...
HThumbnailImage: (byte[])Row["ThumbnailImage"]
) ...
在XAML中,我有一个图像,用于测试,我将其绑定到原始字节数组。当用户从文件选择器中选择图像时,绑定到该属性的图像源将显示该图像。
然而,当我将数据读取回另一个属性时,绑定到该字节数组的另一个测试图像不显示任何内容。所有的绑定都是正确的,我试图在运行时调试,字节数组正在读回来,但它似乎是从原来的大小不同…原来是899字节,一旦从DB中读取出来,它看起来大约是940字节…
SQLite DB中的字段是BLOB。
感谢编辑:按要求提供额外信息:
好的,那么在我的英雄类中,我有这个:
public static ObservableCollection<Hero> GetAllHeroes()
{
ObservableCollection<Hero> Heroes = new ObservableCollection<Hero>();
try
{
var db = new SQLiteDatabase();
DataTable dt = db.GetDataTable("SELECT * FROM Heroes");
foreach (DataRow Row in dt.Rows)
{
Heroes.Add(new Hero(
HID: Convert.ToInt32(Row["ID"]),
HName: Row["Name"].ToString(),
HGold: Convert.ToInt32(Row["Gold"]),
HPlatinum: Convert.ToInt32(Row["Platinum"]),
HDBTag: Row["DBTag"].ToString(),
HReleaseDate: Convert.ToDateTime(Row["ReleaseDate"]),
HAvailable: Convert.ToBoolean(Row["Available"]),
HSale: Convert.ToBoolean(Row["Sale"]),
HFeatured: Convert.ToBoolean(Row["Featured"]),
HThumbnailImage: (byte[])Row["ThumbnailImage"],
HFeaturedThumbnailImage: (byte[])Row["FeaturedThumbnailImage"]
));
}
}
catch (Exception err)
{
System.Windows.Forms.MessageBox.Show(err.Message);
}
return Heroes;
}
和它所涉及的CTOR是:
public Hero(int HID, string HName, int HGold, int HPlatinum, string HDBTag, DateTime HReleaseDate, bool HAvailable, bool HSale, bool HFeatured, byte[] HThumbnailImage, byte[] HFeaturedThumbnailImage)
{
ID = HID;
Name = HName;
Gold = HGold;
Platinum = HPlatinum;
DBTag = HDBTag;
ReleaseDate = HReleaseDate;
Available = HAvailable;
Sale = HSale;
Featured = HFeatured;
ThumbnailImage = HThumbnailImage;
FeaturedThumbnailImage = HFeaturedThumbnailImage;
}
我有以下属性和函数在我的视图模型:
private ObservableCollection<Hero> heroesDBHeroes;
public ObservableCollection<Hero> HeroesDBHeroes
{
get
{
return heroesDBHeroes;
}
set
{
heroesDBHeroes = value;
OnPropertyChanged("HeroesDBHeroes");
}
}
private void HeroesDBAddHeroes()
{
if(HeroesDBHeroes != null)
{
HeroesDBHeroes.Clear();
}
HeroesDBHeroes = Hero.GetAllHeroes();
}
HeroesDBAddHeroes在需要之前被调用。
我有一个数据网格,绑定到这个ObservableCollection。Datagrid代表:
<DataGrid extra:UIElementAttached.IsBubblingMouseWheelEvents="True" ItemsSource="{Binding HeroesDBHeroes}" IsTabStop="False" KeyboardNavigation.TabNavigation="None" Grid.Row="1" IsReadOnly="True">
<DataGrid.Columns>
<extra:DataGridTemplateColumn extra:DataGridColumnAttached.CanUserHideColumn="True" AutomationProperties.Name="Image" CanUserSort="True">
<extra:DataGridTemplateColumn.Header>
<TextBlock Text="Image" HorizontalAlignment="Center" FontWeight="Bold" FontSize="16" Margin="10,0" />
</extra:DataGridTemplateColumn.Header>
<extra:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<Image Source="{Binding ThumbnailImage}" />
</StackPanel>
</DataTemplate>
</extra:DataGridTemplateColumn.CellTemplate>
</extra:DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
绑定到Name的textblock显示正确,但是绑定到ThumbnailImage的图像(这是一个byte[]也在Hero中)没有显示任何东西。
在存储数据之前,您使用Convert.ToBase64String()
对其进行编码,但在读取数据时,您似乎错过了解码部分Convert.FromBase64String()
,即:
byte[] base64Data = (byte[])Row["ThumbnailImage"];
string base64String = System.Text.Encoding.ASCII.GetString(base64Data);
byte[] imageData = Convert.FromBase64String(base64String);
p。您可以在存储和读取时跳过base64编码,直接存储实际的二进制数据。