C# 将文件存入数据库 EF 版

博客展示了一段C#代码,涉及多个命名空间引用,用于一个名为ReportManage的项目。同时提到数据库设计,指出二进制选择图片类型,因其他类型最多只能保存8000个byte,不足以存储。核心围绕二进制文件存入数据库。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace ReportManage
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}

    private void button1_Click(object sender, EventArgs e)
    {
        using (OpenFileDialog dialog = new OpenFileDialog())
        {
            //只能单选一个文件
            dialog.Multiselect = false;
            //选择一个文件
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    //把选择的文件路径给txtPath
                    this.textBox1.Text = dialog.FileName;
                }
                catch (Exception ex)
                {
                    //抛出异常
                    throw (ex);
                }
            }
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {




        FileStream fs = new FileStream(textBox1.Text, FileMode.Open);
        BinaryReader br = new BinaryReader(fs);
        Byte[] byData = br.ReadBytes((int)fs.Length);
        fs.Close();
        ERPEntities db = new ERPEntities();
        report r = new report();

       // string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastIndexOf(".") - aFile.LastIndexOf("\\") - 1)); //文件名
        r.reportname = this.textBox1.Text;
        r.reportfile = byData;
        db.report.Add(r);
        db.SaveChanges();



        //string conn = "server=.;database=testDB;Uid=sa;Pwd=sa ";
        //SqlConnection myconn = new SqlConnection(conn);
        //myconn.Open();
        //string str = "insert into pro_table (pro_name,pro_file) values('测试文件',@file)";
        //SqlCommand mycomm = new SqlCommand(str, myconn);
        //mycomm.Parameters.Add("@file", SqlDbType.Binary, byData.Length);
        //mycomm.Parameters["@file"].Value = byData;
        //mycomm.ExecuteNonQuery();
        //myconn.Close();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        ////string conn = "server=.;database=testDB;Uid=sa;Pwd=sa ";
        ////string str = "select pro_file from pro_table where pro_name='测试文件' ";
        ////SqlConnection myconn = new SqlConnection(conn);
        ////SqlDataAdapter sda = new SqlDataAdapter(str, conn);
        ////DataSet myds = new DataSet();
        ////myconn.Open();
        //sda.Fill(myds);
        //myconn.Close();
        ERPEntities db = new ERPEntities();



        byte[] Files = db.report.FirstOrDefault().reportfile;
        BinaryWriter bw = new BinaryWriter(File.Open("D:\\2.pdf", FileMode.OpenOrCreate));
        bw.Write(Files);
        bw.Close();
    }
}

}
数据库设计如下(二进制 选择图片类型 ,其他类型最多智能保存8000个byte 不够存)
在这里插入图片描述

<think>好的,用户想知道如何将Java或C#的枚举类型映射到数据库,特别是在使用ORM框架时。首先,我得回忆一下常见的方法。对于Java的Hibernate,我记得可以通过@Enumerated注解来处理枚举,默认是存储枚举的序数,也就是数字,但这样如果枚举顺序变化会有问题。所以最佳实践应该是存储枚举的名称,即字符串,这样更稳定。另外,如果数据库有特定的类型,比如PostgreSQL的enum类型,可能需要用自定义类型转换器,比如Hibernate的UserType。 然后是C#的Entity Framework,EF Core默认会把枚举映射为整数,但同样可能希望存储为字符串。可以通过配置ValueConverter来实现,将枚举转换为字符串存储。这样数据库中的可读性更好,也更安全,避免因枚举顺序变化导致的问题。另外,用户可能需要考虑数据库是否支持枚举类型,比如PostgreSQL,这时候可以映射到数据库的枚举类型,但这样迁移时会复杂一些。 还需要考虑代码的可维护性。使用字符串存储虽然更安全,但会占用更多空间。不过现在的数据库优化应该不是大问题。另外,如果枚举值需要频繁变更,可能需要额外的处理,比如数据库迁移脚本更新枚举类型。 用户可能的问题还有如何处理旧的数据库设计,或者如何在不支持枚举的数据库中使用。这时候可能需要手动映射,比如添加转换层,或者在实体中使用字符串字段,然后在getter和setter中进行转换。不过使用ORM的特性会更方便。 总结起来,最佳实践应该是将枚举存储为字符串,利用ORM框架提供的注解或配置来实现,必要时使用自定义类型转换器。同时要考虑数据库的支持情况和维护的便利性。需要确保示例代码正确,并覆盖Java和C#两种情况,可能还要提到常见的陷阱,比如序数存储的风险。</think>### 将枚举类型映射到数据库的实践方法 在Java和C#中,通过ORM框架(如Hibernate/Entity Framework)实现枚举与数据库的映射,主要有以下两种方式: --- #### **1. 存储为字符串(推荐)** **优点**:直观、可读性强,避免因枚举顺序变化导致数据错误 **实现方式**: - **Java(Hibernate)**: 使用`@Enumerated(EnumType.STRING)`注解,将枚举值存储为字符串: ```java @Entity public class User { @Enumerated(EnumType.STRING) private UserRole role; // 存储为 "ADMIN", "USER" 等字符串 } public enum UserRole { ADMIN, USER, GUEST } ``` - **C#(Entity Framework)**: 通过`HasConversion`配置枚举到字符串的转换: ```csharp protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>() .Property(u => u.Role) .HasConversion(v => v.ToString(), v => (UserRole)Enum.Parse(typeof(UserRole), v)); } public enum UserRole { Admin, User, Guest } ``` --- #### **2. 存储为整数** **优点**:节省存储空间 **缺点**:若枚举顺序调整会导致数据不一致[^3] **实现方式**: - **Java**:默认行为(无需显式配置)或使用`@Enumerated(EnumType.ORDINAL)` ```java @Enumerated(EnumType.ORDINAL) // 存储为 0, 1, 2... private UserRole role; ``` - **C#**:默认映射为整数,或显式配置: ```csharp .Property(u => u.Role) .HasConversion<int>(); // 存储为整数 ``` --- #### **3. 高级场景:数据库原生枚举类型** 适用于PostgreSQL等支持自定义枚举类型的数据库: - **Java(Hibernate + PostgreSQL)**: 使用`@Type`注解配合自定义`UserType`: ```java @Type(type = "com.example.PostgreSQLEnumType") @Column(columnDefinition = "user_role") // 数据库中的枚举类型名 private UserRole role; ``` - **C#(Entity Framework + Npgsql)**: 配置数据库枚举映射: ```csharp NpgsqlConnection.GlobalTypeMapper.MapEnum<UserRole>(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasPostgresEnum<UserRole>(); } ``` --- ### **最佳实践总结** 1. **优先使用字符串存储**,提升数据可读性和稳定性[^2] 2. **避免依赖序数**,除非枚举顺序绝对固定 3. **数据库支持时使用原生枚举类型**,兼具类型安全与查询效率 4. **通过ORM特性减少手动转换**,例如Hibernate的`@Converter`或EF Core的`ValueConverter`[^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lisuyan0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值