两种数据库二进制字段存取控制方式的对比

原创 2005年02月28日 19:27:00
方式一:对于小容量的数据,进行一次载入内存,一次性获取
 /// <summary>
  /// 小容量附件数据读取性能测试
  /// </summary>
  /// <param name="strSql"></param>
  /// <returns></returns>
  public  static bool ProcessDataFromDataBaseByAdapter(string strSql,out string strErr)
  {  
   long t0 = Environment.TickCount;  
   DataTable table ;
   if(!OleDataBaseProxy.ExecuteSql(strSql,out table,out strErr))return false;
   long imageDataSizeCount = 0;   
   if(!CapabilityProxy.ProcessDataFromDataBase(ref table,out imageDataSizeCount,out strErr))return false;
   long t1 = Environment.TickCount;
   LogProxy.WriteLog("数据库性能测试:总耗时 "+ Convert.ToString(t1-t0) +" ms,数据量:" + imageDataSizeCount.ToString() + " bytes");
   strErr = "";
   return true;
  }
/// <summary>
  /// 执行数据查询操作
  /// </summary>
  /// <param name="strSql"></param>
  /// <param name="table"></param>
  /// <param name="strErr"></param>
  /// <returns></returns>
  public static bool ExecuteSql(string strSql,out System.Data.DataTable table,out string strErr)
  {
   
   System.Data.OleDb.OleDbConnection Cnn = new OleDbConnection();
   Cnn.ConnectionString = ConfigProxy.GetValueByKey("OleConnectionString");
   System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(strSql,Cnn);
   table = new System.Data.DataTable();  
   try
   {
    adapter.Fill(table);
   }
   catch(Exception Err)
   {
    strErr = Err.Message;
    return false;
   }  
   strErr = "";
   //释放资源
   Cnn.Dispose();
   adapter.Dispose();
   GC.Collect();
   return true;
  }
/// <summary>
  /// 对数据库记录进行处理
  /// </summary>
  /// <param name="table"></param>
  /// <param name="imageDataSizeCount"></param>
  /// <param name="strErr"></param>
  /// <returns></returns>
  private static bool ProcessDataFromDataBase(ref DataTable table,out long imageDataSizeCount,out string strErr)
  {
   imageDataSizeCount = 0;
   for(int i = 0;i < table.Rows.Count;i ++)
   {
    byte [] ImageContent = (byte[])table.Rows[i]["附件内容"]; 
    imageDataSizeCount += Convert.ToInt64(table.Rows[i]["附件容量"]); 
    CapabilityProxy.ProcessImageData(ref ImageContent);
   }
   strErr = "";
   return true;
  }

方式二:在线进行,按指定尺寸分段获取

/// <summary>
  /// 大容量附件数据读取性能测试
  /// </summary>
  /// <param name="strSql"></param>
  /// <returns></returns>
  public static bool ProcessDataFromDataBaseByReader(string strSql,out string strErr)
  {
   long t0 = Environment.TickCount;
   long imageDataSizeCount = 0;
   System.Data.OleDb.OleDbCommand cmd = new OleDbCommand();
   OleDbConnection Cnn = new OleDbConnection(ConfigProxy.GetValueByKey("OleConnectionString"));
   cmd.Connection = Cnn;
   cmd.CommandText = strSql;
   OleDbDataReader reader;
   //开启连接
   try
   {
    Cnn.Open();
   }
   catch(Exception Err)
   {
    strErr = Err.Message;
    return false;
   }
   byte[] pixels = new byte[numPixels];
   long readCount = 0;
   reader = cmd.ExecuteReader();
   //逐条处理
   while(reader.Read())
   {
    for(long i = 0; i< Convert.ToInt64(reader.GetString(7)); i = i + numPixels)
    {
     readCount = reader.GetBytes(6,i,pixels,0,numPixels);
     if(readCount == 0)
     {
      break;
     }
     else if(readCount == numPixels)
     {     
      ProcessImageData(ref pixels);
     }
     else
     {
      byte[]buff = new byte[readCount];
      ProcessImageData(ref buff);
     }
     imageDataSizeCount += readCount;
    }
   }
   reader.Close();
   //关闭连接
   if(Cnn.State == System.Data.ConnectionState.Open)
   {
    Cnn.Close();
   }
   long t1 = Environment.TickCount;
   LogProxy.WriteLog("数据库性能测试:总耗时 "+ Convert.ToString(t1-t0) +" ms,数据量:" + imageDataSizeCount.ToString() + " bytes");
   //释放资源
   Cnn.Dispose();
   cmd.Dispose();
   GC.Collect();
   strErr = "";
   return true;
  }
/// <summary>
  /// 缓冲区大小
  /// </summary>
  public static int numPixels = int.Parse(ConfigProxy.GetValueByKey("BufferSize"));
  /// <summary>
  /// 处理器延时
  /// </summary>
  public static int processImageRepeats = int.Parse(ConfigProxy.GetValueByKey("CpuLateTime"));

两种方式的比较:

第一种方式:减少数据库压力,数据大小已知
第二种方式:增加数据库压力,数据大小未知

总结:
根据实际应用情况进行选择,在二进制字段内容大小已知,数据库负担压力比较大的情况下选择第一种方式;在二进制字段内容大小未知,数据库负担压力较小的情况下选择第二种方式。

设计数据表实现数据库的自主存取控制

设计数据表实现数据库的自主存取控制 Discretionary Access Control (DAC) 近日数据库老师出了一个作业:设计数据表来实现数据库的自主存取控制,一开始对这个...
  • aaa791678470
  • aaa791678470
  • 2017-04-02 07:15:54
  • 514

基于数据库的存取控制实现系统角色控制

一、数据库的存取控制 存取控制是数据库安全技术之一,其它的安全技术还有用户身份鉴别、审计、视图和数据加密。在web应用系统开发过程中,我们也是常用到这些技术。比如进入系统之前需要进行登录,这就是用户...
  • RonghuiMO
  • RonghuiMO
  • 2017-02-27 16:21:29
  • 231

比较两个数据库所有表的字段

比较两个数据库中所有表的所有字段是否一致,检测其中是否有遗漏的表或字段。         因为有300多个表,字段8000多个,一个个比较太费时间,所以采用了稍微简单点的方法。         首...
  • qq_15627543
  • qq_15627543
  • 2016-04-11 16:39:06
  • 1642

当某个表中存在标志表格中记录不同状态的判断性字段的时候,采用两种不同的数据库组织形式,查询执行速度的实验。

 当某个表中存在标志表格中记录不同状态的判断性字段的时候,可以采用两种不同的数据库组织形式。方法一、将两种不同状态的记录分别存储到两个表格中,然后通过C#判断选择某一个表格并执行查询操作。方法二、.将...
  • Depraved_Survival
  • Depraved_Survival
  • 2006-12-27 21:47:00
  • 1872

java保存文件到数据库

  • 2010年04月18日 11:32
  • 901B
  • 下载

SqlServer数据库长文本和二进制字段操作总结(54powerman原创)

SqlServer数据库长文本和二进制字段操作总结(54powerman原创)--创建测试用表Create Table TestnText (RowID Int Identity(1,1) Prima...
  • 54powerman
  • 54powerman
  • 2005-01-23 22:08:00
  • 5853

比较数据库的表,字段是否一致,找出差异的表、字段

有时候测试环境跟正式环境,有一个表没创建,或者某个表有字段没创建,通过以下代码可以实现找出差异的表,字段。#coding=utf-8 #/usr/bin/python import conf impo...
  • zhizunyu2009
  • zhizunyu2009
  • 2017-03-26 11:38:23
  • 454

第十四讲 GridView数据绑定控件(一)

主要内容     能够熟练使用GridView进行数据查询与展示     1. 通过GridView控件,我们可以显示编辑和删除多种不同的数据源(如:数据库,XML文件和公开数据的业务对象)中的数...
  • wljhk2006
  • wljhk2006
  • 2014-05-14 22:27:06
  • 851

自主访问控制dac与强制访问控制mac的原理是什么区别在哪里

转自: http://wenda.tianya.cn/question/23554898588dcb19
  • wangkaiblog
  • wangkaiblog
  • 2014-11-03 19:22:33
  • 7473
收藏助手
不良信息举报
您举报文章:两种数据库二进制字段存取控制方式的对比
举报原因:
原因补充:

(最多只允许输入30个字)