最近,在做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(); }
}
望高手指点一下。我是每次向数据库存储一条,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(); }
}
MDB文件的存储不同于DBF文件
我觉得7楼说的挺有道理。ACCESS的OLE字段是长二进制数据,有可能是16位的吧,而不是8位的二进制byte数据。