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

原创 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"));

两种方式的比较:

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

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

Java通过JDBC访问数据库(两种方式)

Java通过JDBC访问数据库(两种方式)     利用java语言访问数据库时可以采用JDBC,那么什么是JDBC呢?JDBC(Java Data Base Connectivity,java数据库...
  • wild46cat
  • wild46cat
  • 2016年03月19日 15:26
  • 3077

MySql 二进制类型

MySQL二进制类型 二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB等...
  • u011127019
  • u011127019
  • 2015年10月25日 15:04
  • 1874

sqlserver中各个字段类型详解

bit    整型  bit数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或False 、On 或Off.    注意:很省空间...
  • hailang9027
  • hailang9027
  • 2014年02月25日 15:38
  • 3452

c#数据库的两种访问方式总结

本设计中共有8个按钮,对应的代码分别从button1~button8 , 姓名对应的为textbox2,生日对应的dateTimePicker1,号码对应的是textbox3。本例适合新手一次搞懂通过...
  • sgx0554
  • sgx0554
  • 2015年06月07日 18:24
  • 1257

form上传文件的两种方式

示例1:表单里有图片/文件的上传multipart/form-data 是上传二进制数据 form里面的input的值以2进制的方式传过去,所以这里要明白,使用这种格式以后,后台request就获取...
  • shuke_zheng
  • shuke_zheng
  • 2017年11月14日 12:24
  • 154

计算机中二进制数据的编码方式,整理了两篇他人的博客

二进制的三种编码:原码,反码,补码 以前不是很理解,最近有时间进行了补充学习,通过两篇渐进关系的文章让我清晰了很多: 第一篇: 一. 机器数和真值 在学习原码, 反码和补码之前, 需要...
  • dongbaoming
  • dongbaoming
  • 2017年03月03日 16:44
  • 1515

两种数据访问方式:从ADO 到ADO.NET

电脑最大的好处就是可以帮助人处理大量数据,由此离不开对数据库的访问,先看看最近在做ASP.NET例子的时候经常用到的ADO.NET的数据库访问方式。...
  • u010927640
  • u010927640
  • 2016年03月13日 17:17
  • 3179

ADO 与ADO.NET两种数据访问方式区别。

1. ADO与ADO.NET简介   ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、低内存支出和占用磁盘空间较少,支持用...
  • lvjin110
  • lvjin110
  • 2013年09月06日 11:11
  • 1468

多线程实现的两种方式及其区别

继承Threadpublic class Demo2_Thread { public static void main(String[] args) { MyThread mt ...
  • StriverLi
  • StriverLi
  • 2017年02月26日 21:07
  • 1282

MySQL数据库索引问题

数据库对象索引是一种有效组合数据的方式。通过索引对象,可以快速查询到数据库对象表中的特定记录,是一种提高性能的常用方式。 一个索引会包含表中按照一定顺序排序的一列或多列字段。数据库对象索引其实与书的...
  • American199062
  • American199062
  • 2016年05月24日 10:41
  • 846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两种数据库二进制字段存取控制方式的对比
举报原因:
原因补充:

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