最近,在做Access的二进制数据存储,遇到一个奇怪的问题。我向数据库存储44M大小的二进制数据,数据库文件的实际大小变成了89M多,也就是文件大小翻倍。
望高手指点一下。我是每次向数据库存储一条,4096个长度的byte类型的数据,存储10800条记录。理论上大小应该是4096*10800 = 44M左右数据定义如下            byte value = 20;
            byte[] BlockData = new byte[4096];
            for (int i = 0; i < 4096; i++)
            {
                BlockData[i] = value;
            }
             this.Add("", BlockData);
插入数据库的函数如下    /// <summary>
        /// 增加记录
        /// </summary>
        /// <param name="conn">连接</param>
        /// <param name="checkPointName">检测点名称</param>   
        /// <param name="equipmentID">所属设备</param>
        /// <returns>成功,返回true;反之,返回false</returns>
        public bool Add(string conn, byte[] BlockData)
        {
            //是否成功
            bool sucess = false;
            CCommon common = new CCommon();
            //检测点自动编号,每天最大检测点数目90W
            //string code = common.GetCode("10000", 6, "FILEID", "FILEBLOCK");
            int code1 = 1;
            int code2 = 2;
           
                OleDbParameter[] param = new OleDbParameter[3];
                param[0] = new OleDbParameter("@FILEID", code1);
                param[1] = new OleDbParameter("@BLOCKID", code2);
                param[2] = new OleDbParameter("@BlockData",OleDbType.Binary,4096);              
                //param[2] = new OleDbParameter("@BlockData", SqlDbType.Image); 
                
                param[2].Value = BlockData;
                string sql = "insert into FILEBLOCK(FILEID,BLOCKID,BlockData) "
                             + "values(@FILEID,@BLOCKID,@BlockData)";
                //执行
                int result = this.SqlUpdata("", sql, param);
                if (result == -1)
                    this.m_Message = "检测点增加出错!请确保您的Access文件没有以独占方式打开!";
                else
                {
                    sucess = true;
                }
          
            return sucess;
        }
        /// <summary>
        /// 执行SQL语句,返回影响的行数
        /// </summary> 
        /// <param name="conn">配置文件连接串名称</param>
        /// <param name="sql">sql语句</param>
        /// <param name="parameter">参数列表</param>
        /// <returns>失败返回-1;反之,返回受影响的行数</returns>
        public int SqlUpdata(string conn, string sql, OleDbParameter[] parameter)
        {
            //连接
            OleDbConnection myConnection = CConnectDB.GetOleDbConnection(conn);
            //命令
            OleDbCommand myCommand = new OleDbCommand(sql, myConnection);
            int result = -1;            try
            {
                myConnection.Open();
                foreach (OleDbParameter param in parameter)
                {
                    myCommand.Parameters.Add(param);
                }
                for (int i = 0; i < 10800; i++)
                {
                    result = myCommand.ExecuteNonQuery();
                }
                return result;
            }
            catch (Exception ex)
            {
                //出错
                this.m_Message = "执行出错,原因为:" + ex.Message;
                return result;
            }
            finally
            {
                myConnection.Close();
                myConnection.Dispose();
                myCommand.Dispose();            }
        }

解决方案 »

  1.   

    说明一下,ACCESS数据库新增10800条记录,上表只有3个字段(FILEID,BLOCKID,BlockData)的空记录,数据库文件大小增加不超过1M
      

  2.   

    在access中压缩一下access数据库。
    MDB文件的存储不同于DBF文件
      

  3.   

    压缩Access文件,原来做过Access的项目,时间久了,文件都有7-8M了,压缩了一下就剩200K!
      

  4.   

    有需要ACCESS连接串的在这里。我Access存储二进制,用的是OLE对象。我怀疑该字段的二进制是16位的??"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\works\myworks\测试程序\test\BinaryToAccess\BinaryToAccess\bin\Debug\database\OLETEST.mdb;User Id=admin;Password=;" 
      

  5.   

    总结一下,试过很多方法,都是这种问题。而且用VB6写代码向数据库中插入记录,也是文件大小翻倍。
    我觉得7楼说的挺有道理。ACCESS的OLE字段是长二进制数据,有可能是16位的吧,而不是8位的二进制byte数据。