参加新工作已经近一个月了,工作过程中多多少少也遇到了些不大不小的麻烦,经过多方请教高手和求助于网络资源,终于问题迎刃而解,呵呵
工作一大快事,
本来我对文件操作不是很了解,以前只做了数据导出到excel表格的文件操作,是数据导出的,虽说数据导出和数据导入只是个相反的过程,也没什么难的,但是在实际操作中还是遇到了不大不小的问题,这只能说我菜了,呵呵
的确本人确实很菜,但还是想把下边的读取二进制文件入数据库域大家一起分享,并请高手继续指教
读取二进制文件入数据库我分为三个步骤:
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
posted on 2008-01-14 13:02  XiaoMeng  阅读(3981)  评论(3)    收藏  举报