c#大文件读取和写入数据库(带进度条的源代码)

最近一个项目需要将大文件写入和读取到数据库,觉得可能很多人也需要相关得东西,所以就将代码帖出来

protected int state = 0; //表示进度条当前处理的事件类型,1表读取word,2表写入word,3表doc转pdf,4表txt转pdf

private System.Windows.Forms.Form getDialog(string strFormName,System.Drawing.Icon ico,string strShowContent)
  {
   System.Windows.Forms.Form frm = new Form();
   //初始化窗体
   frm.Text = strFormName;
   frm.Icon = ico;
   frm.MaximizeBox = false;
   frm.MinimizeBox = false;
   frm.TopMost = true;
   frm.ShowInTaskbar = false;
   frm.Height = 168;
   frm.Width = 544;
   frm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

//添加控件
   System.Windows.Forms.Label lblContent = new Label();
   lblContent.Text = strShowContent;
            lblContent.Left = 30;
   lblContent.Top = 20;
   lblContent.Text = strShowContent;
   frm.Controls.Add(lblContent);
           
            System.Windows.Forms.ProgressBar prgLoader = new ProgressBar();
   prgLoader.Left=30;
   prgLoader.Top = lblContent.Top + lblContent.Height + 5;
   prgLoader.Width = frm.Width - 2 * 30;
   frm.Controls.Add(prgLoader);
   
   System.Windows.Forms.Label lblShowPercent = new Label();
   lblShowPercent.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
   lblShowPercent.Left = prgLoader.Width + 30 - lblShowPercent.Width;
   lblShowPercent.Top = prgLoader.Height + prgLoader.Top + 5;
            lblShowPercent.Text = prgLoader.Value.ToString() + "%";
   lblShowPercent.Name = "lblShowPercent";
   frm.Controls.Add(lblShowPercent);

System.Windows.Forms.Button btnOK = new Button();
   btnOK.Text = "取消";
   btnOK.Left = prgLoader.Width + 30 - btnOK.Width;
   btnOK.Top = frm.Height - 30 - btnOK.Height;
   btnOK.Click +=new EventHandler(btnOk_Click);
   frm.Controls.Add(btnOK);
           
   return frm;
  }

private void btnOk_Click(object sender,System.EventArgs e)
  {
     //获取控件信息
   System.Windows.Forms.Button btnOk = (System.Windows.Forms.Button)sender;
     System.Windows.Forms.Form frm = (System.Windows.Forms.Form)btnOk.Parent;
   System.Windows.Forms.ProgressBar prgLoader = null;
   foreach(System.Windows.Forms.Control control in frm.Controls)
   {
    if(control.GetType().ToString() == "System.Windows.Forms.ProgressBar")
    {
     prgLoader = (System.Windows.Forms.ProgressBar)control;
    }
   }
   //判断当前的完成情况
   if(prgLoader.Value == 100)
   {
    frm.Close();
   }
   else
   {
    System.Windows.Forms.DialogResult dr = MessageBox.Show(frm,"是否停止当前操作?","提示",System.Windows.Forms.MessageBoxButtons.YesNo,
     System.Windows.Forms.MessageBoxIcon.Warning);
    if(dr == System.Windows.Forms.DialogResult.Yes)
    { 
     state = 0;
     frm.Close();    
    }

}
  }

/// <summary>
        /// 写入word到数据库
        /// </summary>
        /// <param name="sqlcon">sql连接类</param>
        /// <param name="strTargetInsert">直接将目标内容写入数据库的sql,"insert into 表名(目标列名) values (@block)"</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 WriteWordDocument(System.Data.SqlClient.SqlConnection sqlcon,string strTargetInsert,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; //获取文件内容的长度
   string strSelect = ""; //要执行的sql查询语句
   byte []bytContent = null; //定义内容数组
   //比例
      int intPercent = 0;
   //建立要输入的文件流
            System.IO.FileStream fs = null;
   //建立二进制读取
   System.IO.BinaryReader br = null;
   try
   {
    fs = new FileStream(strPath,System.IO.FileMode.Open);
   }
   catch
   {
    return false;
   }
   br = new BinaryReader((Stream)fs);
            //为关键参数赋值
   try
   {
    //是否显示进度
    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 = 2;

if(fs.Length > 2147483647 || fs.Length == 0) //因为image列最多只能存储2,147,483,647个字节,所以这里做限定
     {
      return false;
     }
     intLength = (int)fs.Length;
     intCount = intLength / intBlock;

if(intCount == 0)
     {
      strSelect = strTargetInsert;
      bytContent = new byte[intLength];
      bytContent = br.ReadBytes(intLength);
      sqlcmd.CommandText = strSelect;
      sqlcmd.Parameters.Add("@block",System.Data.SqlDbType.Image).Value = bytContent;
      sqlcmd.ExecuteNonQuery();

}
     else
     {
      strSelect = strTargetInsert;
      bytContent = new byte[intBlock];
      bytContent = br.ReadBytes(intBlock);
      sqlcmd.CommandText = strSelect;
      sqlcmd.Parameters.Add("@block",System.Data.SqlDbType.Image).Value = bytContent;
      sqlcmd.Parameters.Add("@length",System.Data.SqlDbType.Int).Value = 0;
      sqlcmd.ExecuteNonQuery();
           
      int i = 1;
      while(i != intCount)
      {
       if(state == 0)
       {
        strSelect = "delete from " + strTableName + strTargetHandle.Substring(strTargetHandle.LastIndexOf(" where "));
        sqlcmd.CommandText = strSelect;
        sqlcmd.ExecuteNonQuery();
        bytContent = null;
        fs.Close();
        return false;
       }
       strSelect = "declare @content varbinary(16) ";
       strSelect += strTargetHandle;
       strSelect += " updatetext " + strTableName + "." + strColumnName + " @content @length 0 @block";
      
       bytContent = br.ReadBytes(intBlock);

sqlcmd.Parameters["@block"].Value = bytContent;
       sqlcmd.Parameters["@length"].Value = i * intBlock;
       sqlcmd.CommandText = strSelect;
       sqlcmd.ExecuteNonQuery();
       
       intPercent = (int)(((double)(i * intBlock)) / ((double)intLength) * 100);
       prgLoader.Value = intPercent;
       lblShowPercent.Text = prgLoader.Value.ToString() + "%";
       ++i;
       Application.DoEvents();
      }

int intResidual = intLength % intBlock;
      if(intResidual > 0)
      {
       strSelect = "declare @content varbinary(16) ";
       strSelect += strTargetHandle;
       strSelect += " updatetext " + strTableName + "." + strColumnName + " @content @length 0 @block";

bytContent = new byte[intResidual];
       bytContent = br.ReadBytes(intResidual);
                   
       sqlcmd.Parameters["@block"].Value = bytContent;
       sqlcmd.Parameters["@length"].Value = intCount * intBlock;
       sqlcmd.CommandText = strSelect;
       sqlcmd.ExecuteNonQuery();   
      }
     }
     prgLoader.Value = 100;
     lblShowPercent.Text = prgLoader.Value.ToString() + "%";
     btnOk.Text = "关闭";

}
    else
    {
     if(fs.Length > 2147483647 || fs.Length == 0) //因为image列最多只能存储2,147,483,647个字节,所以这里做限定
     {
      return false;
     }
     intLength = (int)fs.Length;
     intCount = intLength / intBlock;

if(intCount == 0)
     {
      strSelect = strTargetInsert;
      bytContent = new byte[intLength];
      bytContent = br.ReadBytes(intLength);
      sqlcmd.CommandText = strSelect;
      sqlcmd.Parameters.Add("@block",System.Data.SqlDbType.Image).Value = bytContent;
      sqlcmd.ExecuteNonQuery();
     }
     else
     {
      strSelect = strTargetInsert;
      bytContent = new byte[intBlock];
      bytContent = br.ReadBytes(intBlock);
      sqlcmd.CommandText = strSelect;
      sqlcmd.Parameters.Add("@block",System.Data.SqlDbType.Image).Value = bytContent;
      sqlcmd.Parameters.Add("@length",System.Data.SqlDbType.Int).Value = 0;
      sqlcmd.ExecuteNonQuery();
    
      int i = 1;
      while(i != intCount)
      {
       strSelect = "declare @content varbinary(16) ";
       strSelect += strTargetHandle;
       strSelect += " updatetext " + strTableName + "." + strColumnName + " @content @length 0 @block";
      
       bytContent = br.ReadBytes(intBlock);

sqlcmd.Parameters["@block"].Value = bytContent;
       sqlcmd.Parameters["@length"].Value = i * intBlock;
       sqlcmd.CommandText = strSelect;
       sqlcmd.ExecuteNonQuery();
       ++i;
      }

int intResidual = intLength % intBlock;
      if(intResidual > 0)
      {
       strSelect = "declare @content varbinary(16) ";
       strSelect += strTargetHandle;
       strSelect += " updatetext " + strTableName + "." + strColumnName + " @content @length 0 @block";

bytContent = new byte[intResidual];
       bytContent = br.ReadBytes(intResidual);
                   
       sqlcmd.Parameters["@block"].Value = bytContent;
       sqlcmd.Parameters["@length"].Value = intCount * intBlock;
       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);
       
      }
      prgLoader.Value = 100;
      lblShowPercent.Text = prgLoader.Value.ToString() + "%";
      btnOk.Text = "关闭";
     }
    }
    else
    {
     if(intCount == 0)
     {
      strSelect = strTargetSelect;
      sqlcmd.CommandText = strSelect;
      bytContent = new byte[intLength];
      bytContent = sqlcmd.ExecuteScalar() as byte[];
      fs.Write(bytContent,0,intLength);
     }
     else
     {
      int i = 0;
      bytContent = new byte[intBlock];
      while(i < intCount)
      {
       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);
       ++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);

}
     }

}
     bytContent = null;
     fs.Close();
   }
   catch
   {
      state = 0;
      System.IO.File.Delete(strPath);
                  bytContent = null;
                  fs.Close();
      return false;
   }
   state = 0;
   return true;
  }

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1537246

c#大文件读取和写入数据库相关推荐

  1. java struts2 excel上传_文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术...

    文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术 如题:文件信息的批量导入-- 项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中 ...

  2. Java 高效大文件 读取 和 写入(一亿行)

    写文件 需求:写入1亿行,7位以内的随机的数字. 首先看成果图,代表没骗大家!!!!! 这个是最终生成的文件,有770多MB .下面用glogg打开预览: 程序打印耗时 7149ms + 923 ms ...

  3. C语言的文件读取与写入操作

    学了一年的C语言了,现在回过头来做一下总结.并且博客开了挺长一段时间却没有谢什么实际的东西.现在做下总结,对之后的学习帮助应该挺大的.与大家共勉! 现在,我先来介绍一下C语言的文件读取与写入的原理和具 ...

  4. python数据框元素的性质_Pandas基础:文件读取与写入、Series和Dataframe、常用基本函数、排序...

    import pandas as pd import numpy as np 查看Pandas版本 pd.__version__ 一.文件读取与写入 1.读取 (a)csv格式 df = pd.rea ...

  5. Pandas基础:文件读取与写入、Series和Dataframe、常用基本函数、排序

    文章目录 一.文件读取与写入 1.读取 (a)csv格式 (b)txt格式 (c)xls或xlsx格式 2. 写入 (a)csv格式 (b)xls或xlsx格式 二.基本数据结构 1.Series ( ...

  6. Java CSV文件读取、写入及追加

    Java CSV文件读取.写入及追加 https://blog.csdn.net/liq816/article/details/81286472 追加: FileOutputStream out = ...

  7. python按行读取文件效率高吗_Python按行读取文件的实现方法【小文件和大文件读取】...

    本文实例讲述了Python按行读取文件的实现方法.分享给大家供大家参考,具体如下: 小文件: #coding=utf-8 #author: walker #date: 2013-12-30 #func ...

  8. pandas使用to_feather函数将dataframe保存为feather文件(需要依赖pyarrow包)提升大文件读取效率、pandas使用read_feather函数读取feather文件

    pandas使用to_feather函数将dataframe保存为feather文件(需要依赖pyarrow包)提升大文件读取效率.pandas使用read_feather函数读取feather文件. ...

  9. c语言文件读取与写入

    fopen的介绍转自百度百科:https://baike.baidu.com/item/fopen/10942321?fr=aladdin 函数原型: FILE * fopen(const char ...

最新文章

  1. 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)
  2. 如何给iOS 分类添加 属性
  3. html wbr标签,HTML wbr标签
  4. 008_html属性
  5. Kubernetes1.5新特性(一):Kubelet API增加认证和授权能力
  6. neo4j 4.1.8版本安装图算法包
  7. 重定义 不同的基类型_镍及铁镍基耐蚀合金高温合金哈氏合金镍基合金之第一篇概述...
  8. python模拟键盘输入_这件神器,每个 Python入门学习者都值得一试
  9. 解读webpack的bundle.js
  10. select a method for export 选项
  11. ThinkPhp 使用 PHP_XLSXWriter 代替 PHPExcel 百万级数据单次导出
  12. C语言程序设计课题分析,C语言程序设计综合实践性教学课题报告.doc
  13. SQL Server生成含有数据的脚本文件
  14. 模拟SAP ALV下载XLSX文件
  15. [python]python生成md5
  16. 德纳研报丨基于区块链的邮箱Damil已完成种子轮融资,会是下一个ENS吗
  17. android4.4中添加方案,Android4.0-4.4 添加实体按键振动支持的方法(java + smali版本)
  18. jxl创建excel加水印
  19. Conmi的正确答案——米家第一个ReactNative程序开发记录
  20. 吐槽板。(就当是个留言板吧....)

热门文章

  1. 第十六届全国大学生智能汽车竞赛--百度智慧交通(东部赛区)
  2. 基于ESP8266 WiFi控制的步进升降机械平台
  3. java restful netty_Java RESTful 框架的性能比较
  4. 网站自己生成专题php,phpcms生成专题的同时自动生成专题相关文章
  5. windows 将python源代码加密_对源代码进行pyd加密
  6. java生成pdf看不到至值_java生成pdf报错找不到DPF标题签名
  7. java hello work_Java入门教程系列 – 第一个程序 “hello, world”
  8. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...
  9. php 邮编正则,php抓取百度邮编搜索结果,应改如何写正则表达式?
  10. 数据集按类划分_用特别设计的损失处理非均衡数据