将大文件分块读入数据库,这是一个很好的思想,不知道可不可以应用到毕设中,二十几兆的txt要怎么分块,具体怎么实现还要再想想
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
最近一个项目需要将大文件写入和读取到数据库,我们知道sqlserver 的image列最多只能容纳2,147,483,647个字节,如果遇到超过10mb以上的数据如果想在网络上一次写进去或者读出是不可能的,第一sql server的连接时间默认是15s,即使将连接时间设置到更长的时间能够将一个文件写入或者读取到数据库,我想没有用户想对着一个毫无响动的界面傻等10多分钟或者更长的时间。所以这里我调用了存储过程来将image列或要写入的文件划分成若干数据块来上传,这样不但可以不受sql server的连接时间的限制,而且可以通过数据块来度量文件的写入或者读取的进度,其实这里如果将存储过程写在数据库可能执行数率要快一些,但我个人一直认为如果将存储过程写在数据库中,尤其是在测试阶段或者项目迁移的阶段,很有可能出现将存储过程丢失的情况,还有个重要的原因,众所周知存储过程的异常是相当不好调试的,但如果我将存储过程写入代码,我就可以通过try catch来捕获在执行存储过程的时产生的异常,这能有效的降低项目的风险提高代码的容错性。代码如下
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();
}
}
}
///
/// 写入word到数据库
///
/// sql连接类