C#读取大文件(三)

简介:
sqlcmd.CommandText = strSelect;    
             sqlcmd.ExecuteNonQuery();            
            }    
         }    
        }    
        bytContent =  null ;    
        fs.Close();    
     }    
      catch     
     {    
        state = 0;    
        bytContent =  null ;    
        fs.Close();    
         return   false ;    
     }    
     state = 0;    
      return   true ;    
    }    
 
                 /// <summary>    
                 /// 从数据库读取word    
                 /// </summary>    
                 /// <param name="sqlcon">sql连接类</param>    
                 /// <param name="strTargetSelect">直接获取目标内容的sql,"select 目标列名 from 目标表名 where 条件"</param>    
                 /// <param name="strTargetLength">获取目标内容的长度的sql,"select datalength(目标列名) from 目标表名 where 条件"</param>    
                 /// <param name="strTargetHandle">获取目标内容的句柄的sql,"select @content=textptr(目标列名) from 目标表名 where 条件"</param>    
                 /// <param name="strTableName">目标表名</param>    
                 /// <param name="strColumnName">目标列名</param>    
                 /// <param name="strPath">要导出并保存的word的路径</param>    
                 /// <param name="intSetBlock">定义块大小</param>    
     /// <param name="bolShowDialog">是否显示进度条</param>    
     /// <param name="strFormName">窗体名称</param>    
     /// <param name="ico">窗体图标</param>    
     /// <param name="strShowContent">显示内容</param>    
                 /// <returns>true表成功</returns>    
     public   bool  ReadWordDocument(System.Data.SqlClient.SqlConnection sqlcon, string  strTargetSelect, string  strTargetLength, string  strTargetHandle, string  strTableName, string  strColumnName, string  strPath, int  intSetBlock, bool  bolShowDialog, string  strFormName,System.Drawing.Icon ico, string  strShowContent)    
{    
      //初始化SqlCommand    
                        System.Data.SqlClient.SqlCommand sqlcmd =  new  System.Data.SqlClient.SqlCommand();    
                        sqlcmd.Connection = sqlcon;    
     sqlcmd.CommandType = System.Data.CommandType.Text;    
 
      int  intBlock = intSetBlock;  //块大小    
      int  intCount = 0;  //分快数    
      int  intLength = 0;  //获取的image列中的内容的长度    
      string  strSelect = "";  //要执行的sql查询语句    
      byte  []bytContent =  null //定义内容数组    
      int  intPercent = 0;  //获取读取的比例    
      //建立要输出的文件流    
     System.IO.FileStream fs =  new  FileStream(strPath,System.IO.FileMode.Create);    
 
      try     
     {    
         //获取指定image列中的内容长度    
        sqlcmd.CommandText = strTargetLength;    
        intLength = ( int )sqlcmd.ExecuteScalar();    
         //如果长度为0    
         if (intLength == 0)    
        {    
          return   false ;    
        }    
         //获得分快数    
        intCount = intLength / intBlock;    
 
                                 //是否显示精度    
         if (bolShowDialog)    
        {    
          //获取精度窗体,引用窗体中的进度条和按钮控件    
         System.Windows.Forms.Form frmProgress = getDialog(strFormName,ico,strShowContent);    
         System.Windows.Forms.ProgressBar prgLoader =  null ;    
         System.Windows.Forms.Button btnOk =  null ;    
         System.Windows.Forms.Label lblShowPercent =  null ;    
          foreach (System.Windows.Forms.Control control  in  frmProgress.Controls)    
         {    
             if (control.GetType().ToString() ==  "System.Windows.Forms.ProgressBar" )    
            {    
             prgLoader = (System.Windows.Forms.ProgressBar)control;    
            }    
             if (control.GetType().ToString() ==  "System.Windows.Forms.Button" )    
            {    
             btnOk = (System.Windows.Forms.Button)control;    
 }    
             if (control.GetType().ToString() ==  "System.Windows.Forms.Label"  && control.Name ==  "lblShowPercent" )    
            {    
             lblShowPercent = (System.Windows.Forms.Label)control;    
            }    
         }    
             
         frmProgress.Show();    
          //启动转换    
         state = 1;    
          if (intCount == 0)    
         {    
            strSelect = strTargetSelect;    
            sqlcmd.CommandText = strSelect;    
            bytContent =  new   byte [intLength];    
            bytContent = sqlcmd.ExecuteScalar()  as   byte [];    
            fs.Write(bytContent,0,intLength);    
            prgLoader.Value = 100;    
            lblShowPercent.Text = prgLoader.Value +  "%" ;    
            btnOk.Text =  "关闭" ;    
                
         }    
          else     
         {    
             int  i = 0;    
            bytContent =  new   byte [intBlock];    
             while (i < intCount)    
            {    
              if (state == 0)    
             {    
                bytContent =  null ;    
                System.IO.File.Delete(strPath);    
                fs.Close();    
                 return   false ;    
             }    
             strSelect =  "declare @content varbinary(16) " //再sql中声明获取目标image列内容的句柄变量    
             strSelect += strTargetHandle;  //获取句柄    
              //锁定并读取指定长度的数据    
             strSelect +=  " readtext "  + strTableName +  "."  + strColumnName +  " @content @start @count HOLDLOCK" ;    
              if (i == 0)    
             {    
                 //添加@start和@count变量,分别表偏移变量和取的长度    
 sqlcmd.Parameters.Add( "@start" ,System.Data.SqlDbType.Int).Value = 0;     
                sqlcmd.Parameters.Add( "@count" ,System.Data.SqlDbType.Int).Value = intBlock;    
             }    
              else     
             {    
                sqlcmd.Parameters[ "@start" ].Value = i * intBlock;    
                sqlcmd.Parameters[ "@count" ].Value = intBlock;    
             }    
             sqlcmd.CommandText = strSelect;    
             bytContent = sqlcmd.ExecuteScalar()  as   byte [];    
             fs.Write(bytContent,0,intBlock);    
             intPercent = ( int )((( double )(i * intBlock)) / ( double )(intLength) * 100);    
             prgLoader.Value = intPercent;    
             lblShowPercent.Text = prgLoader.Value.ToString() +  "%" ;    
             Application.DoEvents();    
             ++i;    
            }    
             //将剩余的字节写入流    
             int  intResidual = intLength % intBlock;    
             if (intResidual > 0)    
            {    
             strSelect =  "declare @content varbinary(16) " //再sql中声明获取目标image列内容的句柄变量    
             strSelect += strTargetHandle;  //获取句柄    
              //锁定并读取指定长度的数据    
             strSelect +=  " readtext "  + strTableName +  "."  + strColumnName +  " @content @start @count HOLDLOCK" ;    
             bytContent =  new   byte [intResidual];    
             sqlcmd.Parameters[ "@start" ].Value = intCount * intBlock;    
             sqlcmd.Parameters[ "@count" ].Value = intResidual;    
             sqlcmd.CommandText = strSelect;    
             bytContent = sqlcmd.ExecuteScalar()  as   byte [];    

             fs.Write(bytContent,0,intResidual);    



本文转自 BruceAndLee 51CTO博客,原文链接:http://blog.51cto.com/leelei/194146,如需转载请自行联系原作者

相关文章
|
大数据 C#
C# 读取大文件 (可以读取3GB大小的txt文件)
原文:C# 读取大文件 (可以读取3GB大小的txt文件) 在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件。
4834 1
|
前端开发 C#
C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小
C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小
|
C# 内存技术
C# FileStream复制大文件
即每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法。 本文转载:http://www.cnblogs.com/wolf-sun/p/3345392.html     FileStream缓冲读取和写入可以提高性能。
1611 0
|
11月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
450 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
496 3
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
2473 0