C#读取二进制文件入数据库

 

读取二进制文件入数据库我分为三个步骤:

1,读取二进制文件入结构体,当然定义结构体之前必须知道二进制文件存储的方式是什么,否则将读出乱码来

在c#中定义有固定大小的结构体域其他语言不同的是得费点事拉

在结构体内部变量中声明指定大小的变量这样来声明

以下是本人声明的结构体例子

/// <summary>

    /// 消费账单结构体

    /// </summary>

    public struct UseBill_InfoTemp

    {

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] usebill_id;//账单id

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] manager_id;//运营商id

        [MarshalAs(UnmanagedType.U1, SizeConst = 64)]

        public byte[] manager_name;//运营商名称

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] agent_id;//代理商id

        [MarshalAs(UnmanagedType.U1, SizeConst = 64)]

        public byte[] agent_name;//代理商名称

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] hotel_group_id;

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] hotel_id;//宾馆id

        [MarshalAs(UnmanagedType.U1, SizeConst = 64)]

        public byte[] hotel_name;//宾馆名称

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] provider_id;//广告商id

        [MarshalAs(UnmanagedType.U1, SizeConst = 64)]

        public byte[] provider_name;//广告商名称

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] guset_id;//顾客id

        [MarshalAs(UnmanagedType.U1, SizeConst = 20)]

        public byte[] guest_name;//顾客名称

        [MarshalAs(UnmanagedType.I2)]

        public ushort flag;//标识

        [MarshalAs(UnmanagedType.I2)]

        public ushort main_type;//主类型

        [MarshalAs(UnmanagedType.U1, SizeConst = 20)]

        public byte[] main_type_name;//主类型名称

        [MarshalAs(UnmanagedType.I2)]

        public ushort sub_type;//子类型

        [MarshalAs(UnmanagedType.U1, SizeConst = 20)]

        public byte[] sub_type_name;//子类型名称

        [MarshalAs(UnmanagedType.U1,SizeConst=14)]

        public byte[] use_time;//消费使用时间

        [MarshalAs(UnmanagedType.U1, SizeConst = 4)]

        public byte[] room_id;//房间id

        [MarshalAs(UnmanagedType.U1,SizeConst=10)]

        public byte[] room_no;//房间编号

        [MarshalAs(UnmanagedType.I2)]

        public ushort fee;//消费金额

        [MarshalAs(UnmanagedType.U1, SizeConst = 8)]

        public byte[] info_id;

        [MarshalAs(UnmanagedType.U1, SizeConst = 64)]

        public byte[] chs_name;//名称

    }

上面就是我定义的结构体,当然在读取数据的时候也是知道数据是按照扫描顺序存贮在二进制文件中的,下边是我读取二进制文件入结构体中的代码

FileStream fs = new FileStream(dtFileinfo.Rows[i]["filePath"].ToString(), FileMode.Open);

                        BinaryReader br = new BinaryReader(fs, Encoding.GetEncoding("gb2312"));

                        string File_Head = Encoding.Default.GetString(br.ReadBytes(10));

                        if (File_Head.Length > 0)

                        {

                            for (int j = 0; j < (fs.Length - 10) / 74; j++)//74是结构体的总字节数大小

                            {

                                use_billTemp.usebill_id = br.ReadBytes(8);

                                use_billTemp.manager_id = br.ReadBytes(8);

                                use_billTemp.manager_name = br.ReadBytes(64);

                                use_billTemp.agent_id = br.ReadBytes(8);

                                use_billTemp.manager_name = br.ReadBytes(64);

                                use_billTemp.hotel_id = br.ReadBytes(8);

                                use_billTemp.hotel_name = br.ReadBytes(64);

                                use_billTemp.provider_id = br.ReadBytes(8);

                                use_billTemp.provider_name = br.ReadBytes(64);

                                use_billTemp.guset_id = br.ReadBytes(8);

                                use_billTemp.guset_name = br.ReadBytes(20);

                                use_billTemp.flag = br.ReadUInt16();

                                use_billTemp.main_type = br.ReadUInt16();

                                use_billTemp.sub_type = br.ReadUInt16();

                                use_billTemp.use_time = br.ReadBytes(14);

                                use_billTemp.room_id = br.ReadBytes(4);

                                use_billTemp.fee = br.ReadUInt16();

                                use_billTemp.info_id = br.ReadBytes(8);

                                use_billTemp.chs_name = br.ReadBytes(64);

                                use_billTemp.hotel_group_id = br.ReadBytes(8);

                         }

二进制文件就是按照上面的顺序存储的,所以我知道每个字段该读多少,一行共读多少字段,然后才循环下一行继续重复读入数据

一行一行的存入数据库

Type text here

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值