如何把一个word文档中的内容写入到数据库中?

如何把一个word文档中的内容写入到数据库中?,第1张

首先,建立一个Access2000数据库data.mdb,在库中建立一个表userdata,里面有“工号”、“姓名”、“性别”、“部门”四个字段,都是字符型的,再输入一些数据,再建立一个窗体Form1,在Form1中,放置以下控件:

控件名称 属性 值 说明

Tlabel1 Caption "请输入文件名"

TEdit1 Name "" 用来输入文件名,带扩展名的

TButton1 Caption "保存"

TButton2 Caption "退出"

ADOTable1 Active

ConnectionString

TableName True

Provider=Microsoft.Jet.OLEDB.4.0Data Source=data.mdbPersist Security Info=False

userdata

下面是相关代码:

file://---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1

---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Variant OLEObject

AnsiString dataword

if(Trim(Edit1->Text)=="")

{

ShowMessage("请输入文件名")

return

}

String currentPath=GetCurrentDir()+"//"+Trim(Edit1->Text)

OLEObject=CreateOleObject("Word.Basic")

OLEObject.Exec(Procedure("FileNew"))

OLEObject.Exec(Procedure("EndOfDocument"))

ADOTable1->First()

while(ADOTable1->Eof!=True)

{

dataword=ADOTable1->FieldValues["工号"]+ADOTable1->FieldValues["姓名"]+ADOTable1->FieldValues["性别"]+ADOTable1->FieldValues["部门"]

OLEObject.Exec(Procedure("Insert")<<dataword)

ADOTable1->Next()

}

OLEObject.Exec(Procedure("StartOfDocument"))

OLEObject.Exec(Procedure("FileSaveAs")<<currentPath)

OLEObject.Exec(Procedure("FileClose")<<1)

ShowMessage("文件已经写入!谢谢使用!")

}

---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

this->Close()

}

---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Click(TObject *Sender)

{

Edit1->Text=""

}

你先将文本文件按换行符的分开读到一个字符窜变量中去,name:=copy(str1,0,4),加到数据库中去呀。

比如:str1:='张某;19;一(1)',然后就分化这个字符窜,将他逐个加到数据库中去呀

最近利用空闲时间自己在写一个文件备份工具,因为我磁盘上的很多文件很重要,例如很多PPT和讲义。所以需要经常备份,而且因为这些文件很多,所以需要增量备份。

我尝试用过windows自带的ntbackup工具,但感觉不是很爽。它不支持压缩备份,而且界面也有点复杂。

为了响应伟大领袖的“自力更生,丰衣足食”的号召,咱决定自己写一个工具,专门备份到数据库。支持压缩,支持加密,支持增量。

本文分享一下其中一些重点的技术细节

其中一个关键的技术就是将文件使用二进制的方式存放在数据库的varbinary(max)的字段中。该字段最大允许的长度为2GB。

对于一些小文件,我们可以一次性读取它的所有字节,然后一次提交到数据库

/// <summary>

/// 这个方法演示了如何一次提交所有的字节。这样导致的结果是:应用程序立即需要申请等同于文件大小的内存

/// </summary>

static void SubmitFileByOnce() {

string file = @"F:\功夫熊猫.rmvb"//文件大小为519MB

byte[] buffer = File.ReadAllBytes(file)

using (SqlConnection conn = new SqlConnection("server=(local)database=demointegrated security=true")) {

using (SqlCommand cmd = conn.CreateCommand())

{

cmd.CommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)"

cmd.Parameters.AddRange(

new[]

{

new SqlParameter("@fileName",file),

new SqlParameter("@fileContents",buffer)

})

conn.Open()

cmd.ExecuteNonQuery()

conn.Close()

}

}

}

但是,上面的方法有几个问题,主要体现在如果文件比较大的话

1. 它需要一次性很大的内存,具体数据等同于文件大小。因为File.ReadAllBytes方法是将所有字节全部读入到内存。

2. 它会导致提交失败,就是因为数据太大了。数据库也会拒绝。

那么,我就对这个方法做了一下改进,将文件拆分为5MB一段,也就是说,此时每次申请的内存只有5MB。这就大大地提高了可用性。

/// <summary>

/// 这个方法是将文件切分为5MB的块,每次只是提交5MB,所以可能多次提交,但内存占用就比较小

/// </summary>

static void SubmitFileStepByStep() {

string file = @"F:\功夫熊猫.rmvb"//以这个文件为例,大小为519MB,一共需要的时间大约94秒。还是有点慢的,所以还可能需要进行压缩

FileStream fs = new FileStream(file, FileMode.Open)

byte[] buffer = new byte[5 * 1024 * 1024]

int readCount

using (SqlConnection conn = new SqlConnection("server=(local)database=demointegrated security=true"))

{

conn.Open()

while ((readCount = fs.Read(buffer, 0, buffer.Length)) >0)

{

using (SqlCommand cmd = conn.CreateCommand())

{

cmd.CommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)"

cmd.Parameters.AddRange(

new[]

{

new SqlParameter("@fileName",file),

new SqlParameter("@fileContents",buffer)

})

cmd.ExecuteNonQuery()

}

}

conn.Close()

}

}

这样的话,有一个后果就是一个文件,可能在数据库中会有多条记录。所以在读取的时候,我们需要对其进行合并

static void DownloadFile() {

string file = @"F:\功夫熊猫.rmvb"

string destfile = @"E:\Temp\Temp.wmv"

using (SqlConnection conn = new SqlConnection("server=(local)database=demointegrated security=true"))

{

using (SqlCommand cmd = conn.CreateCommand())

{

cmd.CommandText = "SELECT FileContents FROM Files WHERE FileName=@fileName"

cmd.Parameters.AddRange(

new[]

{

new SqlParameter("@fileName",file),

})

conn.Open()

SqlDataReader reader = cmd.ExecuteReader()

FileStream fs = new FileStream(destfile, FileMode.Append, FileAccess.Write)

while (reader.Read())

{

byte[] buffer = (byte[])reader[0]

fs.Write(buffer, 0, buffer.Length)

}

fs.Close()

reader.Close()

conn.Close()

}

}

}

本文由作者:陈希章


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6674624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存