Base64 字符串在数据库中保存为空 C#
Posted
技术标签:
【中文标题】Base64 字符串在数据库中保存为空 C#【英文标题】:Base64 string saves in database as null C# 【发布时间】:2021-09-01 17:07:41 【问题描述】:我在将图像转换为 Base64 字符串并将其作为字符串保存在数据库中时遇到问题,但它没有返回任何内容。 Base64Text 是全局变量,变量不为空我用按钮填充文本框测试它,它只是保存为“”到数据库中。
这是数据库中的表模型
public class Product
public int Id get; set;
public string ProductName get; set;
public double ProductPrice get; set;
public int ProductAmount get; set;
public string ProductImage get; set; // Used for storing image string
public int userID get; set;
// Here is image converter
private void btnAddImage_Click(object sender, EventArgs e)
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Image Files(*.BMP;*.JPG;*.PNG;*.JPEG)|*.BMP;*.JPG;*.PNG;*.JPEG" +
"|All files(*.*)|*.*";
dialog.CheckFileExists = true;
dialog.Multiselect = false;
if (dialog.ShowDialog() == DialogResult.OK)
var image = new Bitmap(dialog.FileName);
pictureBoxProductImage.Show();
pictureBoxProductImage.Image = (Image)image;
byte[] imageArray = System.IO.File.ReadAllBytes(dialog.FileName);
base64Text = Convert.ToBase64String(imageArray);
// Here is saving image using Entity framework
private void btnAddProduct_Click(object sender, EventArgs e)
string imagePath = base64Text;
if (txtBoxProductName.Text == null || txtBoxProductPrice.Text == null || txtBoxProductQuantity.Text == null || imagePath == null || imagePath == "")
MessageBox.Show("Please fill required information!", "", MessageBoxButtons.OK);
else
model.ProductName = txtBoxProductName.Text;
model.ProductPrice = Convert.ToDouble(txtBoxProductPrice.Text);
model.ProductAmount = Convert.ToInt32(txtBoxProductQuantity.Text);
model.ProductImage = imagePath;
model.userID = id;
using (var context = new ProductContext())
context.Products.Add(model);
context.SaveChanges();
MessageBox.Show("Product sucesffuly added to database!", "", MessageBoxButtons.OK);
Clear();
【问题讨论】:
乍一看,我注意到您正在将整个图像转换为base64,而不仅仅是路径!其次,你能告诉我们 DbContext 吗?保存操作后您是否查看了数据库的内容? 所有其他数据都正确保存为书面预期图像字符串“”,所以我需要保存路径而不是 base64string? 您能否提供有关您所针对的 EF 版本以及您使用的数据库的更多信息? binaryintellect.net/articles/…我建议按照上面的例子......特别注意从内存流复制到方法的实体配置和字节数组 在哪里实例化产品实体?可能是您在保存后将其图像属性设置在其他位置,EF 仍然跟踪该对象,并且在另一个保存事务中它被重置为 null 由于您将整个图像保存为 base64 不仅是路径,我认为您可能会在表格中遇到一些限制,因为结果 base64 会很长。我建议您只保存路径或使用其他数据类型来存储二进制文件 - 如果文件在所有机器上本地不可用或在线不可用 -。 【参考方案1】:您看起来正在危险地混合变量范围。考虑到这段代码:
model.ProductName = txtBoxProductName.Text;
model.ProductPrice = Convert.ToDouble(txtBoxProductPrice.Text);
model.ProductAmount = Convert.ToInt32(txtBoxProductQuantity.Text);
model.ProductImage = imagePath;
model.userID = id;
using (var context = new ProductContext())
context.Products.Add(model);
context.SaveChanges();
'model' 不在此方法的范围内。
我不建议将视图绑定到实体作为视图模型,而是使用普通的 C# ViewModel 类来避免混淆和有多个关注点的实体。 (属性更改跟踪、UI 验证行为等)
它应该看起来更像:
using (var context = new ProductContext())
var product = new Product
UserId = id,
ProductName = txtBoxProductName.Text,
ProductPrice = Convert.ToDouble(txtBoxProductPrice.Text),
ProductAmount = Convert.ToInt32(txtBoxProductQuantity.Text),
ProductImage = hiddenImage.Text, // Something in the scope of the view storing the image Base64 content, not a global variable.
;
context.Products.Add(product);
context.SaveChanges();
添加实体时,您要确保处理的是该实体的新实例,而不是引用。 model
可能是对上下文已经在跟踪的另一个实体的引用,这意味着当您认为要添加新行时,您最终可以替换完全不同记录上的值。此外,由于您正在确定一个新的 DbContext 实例的范围,因此该范围之外的任何实体引用都可能导致异常。
任何细节都避免使用全局变量。选择图像时,请确保 Base64 存储在应用页面或绑定视图模型范围内的某个位置。如果在这些更改之后仍然没有保存 ProductImage,那么我会查看实体声明以确保它没有被标记为 Ignore
,并考虑使用探查器来查看正在生成的 SQL 以确保该字段正在被包含以及正在发送什么值。
【讨论】:
以上是关于Base64 字符串在数据库中保存为空 C#的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 数据库中保存文件 base64 字符串
我想将图像数据(Texture2D)转换为 Base64 字符串并存储在 Unity3D(C#)中的 JSON 文件中