QQ登录

只需一步,快速开始

306上位机VC MFC使用ADO进行音频文档文件的保存与读取

[ 复制链接 ]

306上位机VC MFC使用ADO进行音频文档文件的保存与读取

306上位机VC MFC使用ADO进行音频文档文件的保存与读取

ADO音频文档保存与读取
功能展示
我们电脑上的音乐如MP3,文档如果word,ppt等都可以保存到数据库文件中,当然也可以从数据库文件提取出事先保存的文件,我们当前例程就实现了二进制大对象的存取功能,效果如图,四下按钮上,下,最后,第一条记录可以浏览数据,<添加文件到记录>,可以选择要保存到数据库的文件,如TXT文件,<从记录读取文件>,可以从数据库当前字段提取文件保存到电脑上;

要点提示
在进行二进制大对象的存取时,因为对象数据可能很大,一般不可能一次读完,得多次读取,所以要定义一个数据包的大小,以确定一次读多少数据。
在存取文件时,使用Field对象的GetChunk()函数和AppendChunk()函数访问文件,一次读取或写入部分数据,这两函数可自己记住上次访问的位置,但中途访问了其它的信息,就要从头开始;

实现功能
1.新建基于对话框的应用程序
2.在STDAFX.H头文件中添加支持ADO的代码#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
3.给主对话框添加变量public: _ConnectionPtr m_pConnection; _RecordsetPtr m_pSet; 并初始化
::CoInitialize(NULL);//初始化com环境
HRESULT hr;//创建连接对象和记录集对象
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
if(SUCCEEDED(hr))//创建成功
{
hr = m_pConnection->Open(
"rovider=Microsoft.Jet.OLEDB.4.0;Data Source=DatabaseBlob.mdb",
"","",adModeUnknown);
}
}
catch(_com_error e)///捕获异常
{
CString Error;
Error.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(Error);///提示错误信息
}
m_pSet.CreateInstance(__uuidof(Recordset));//创建记录集对象
//打开表TableBlob
hr = m_pSet->Open("SELECT * FROM TableBlob",
_variant_t((IDispatch *)m_pConnection,true),
adOpenDynamic,adLockPessimistic,adCmdText);
if(SUCCEEDED(hr))//打开表成功
{
ReadOutData();//读数据
}
4.添加三自定义函数public: void ReadOutData(); void FileTranstoDb(CString strPath); void DbTranstoFile(CString strPath);
void CGkbc8Dlg::ReadOutData()
{
if(m_pSet->adoEOF||m_pSet->BOF) //判断是否在第一条记录和最后一条记录
{
SetDlgItemText(IDC_NAME,"");
SetDlgItemText(IDC_SUFFIX,"");
return;
}
CString sText;
sText = m_pSet->GetCollect("Name").bstrVal;//读Name字段
SetDlgItemText(IDC_NAME,sText);
sText = m_pSet->GetCollect("Suffix").bstrVal;//读Suffix字段
SetDlgItemText(IDC_SUFFIX,sText);
}
void CGkbc8Dlg:bTranstoFile(CString strFilePath)
{
CFile file;
_variant_t varChunk;
BYTE buffer[ChunkSize];//内存数据包
file.Open(strFilePath,CFile::modeWrite|CFile::modeCreate);//打开文件
long IsRead=0;
long FileSize = m_pSet->Fields->Item["Data">->ActualSize;//得到字段Data的大小

while(FileSize>0)//字段大于0
{
//比较数据包与字段数据空间的大小
IsRead=FileSize>=ChunkSize? ChunkSize:FileSize;
varChunk = m_pSet->Fields->Item["data">->GetChunk(IsRead);//从字段Data中获取一个数据包
for(long i=0;i<IsRead;i++)//将数据包读入内存
{
::SafeArrayGetElement(varChunk.parray,&i,buffer+i);
}
file.Write(buffer,IsRead);//将内存中数据包写入文件
FileSize-=IsRead;
}
file.Close();//关闭文件
}
5.依照例程界面添加两编辑框IDC_NAME, IDC_SUFFIX,六按钮《第一条记录》《上一条记录><最后一条记录><下一条记录><添加文件到记录><从记录读取文件>关联按钮的点击函数
void CGkbc8Dlg::OnRecordFirst() //第一条
{
m_pSet->MoveFirst();
ReadOutData();
}

void CGkbc8Dlg::OnRecordPrev() //上一条
{
m_pSet->MovePrevious();//前一记录
if(m_pSet->BOF)//到达开始
m_pSet->MoveFirst();
ReadOutData();//读数据
}

void CGkbc8Dlg::OnRecordNext() //下一条
{
m_pSet->MoveNext();//下一记录
if(m_pSet->adoEOF)//到达末尾
m_pSet->MoveLast();
ReadOutData();//读数据
}

void CGkbc8Dlg::OnRecordLast()
{
m_pSet->MoveLast();//移到最后一条记录
ReadOutData(); //读数据
}
void CGkbc8Dlg::OnRecordAdd()
{
CFileDialog Dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"All Files (*.*)|*.*||",NULL);
if(Dlg.DoModal() == IDOK)//如果单击了“确定”按钮
{
//增加记录
m_pSet->AddNew();
m_pSet->utCollect("Name",_variant_t(Dlg.GetFileTitle()));//写Name字段
SetDlgItemText(IDC_NAME,Dlg.GetFileTitle() );



CString strSuffix = "." + Dlg.GetFileExt();
m_pSet->utCollect("Suffix",_variant_t(strSuffix));//写Suffix字段
SetDlgItemText(IDC_SUFFIX,strSuffix);

m_pSet->Update();//更新数据库
FileTranstoDb(Dlg.GetPathName());//写二进制文件到数据库
AfxMessageBox("向数据库写文件完成!!");
}
}

void CGkbc8Dlg::OnRecordRead()
{
CString sFileName,sExt;
GetDlgItemText(IDC_NAME,sFileName);
GetDlgItemText(IDC_SUFFIX,sExt);
CFileDialog Dlg(FALSE,sExt,sFileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"All Files (*.*)|*.*||",NULL);
if(Dlg.DoModal() == IDOK)//如果单击了“确定”按钮
DbTranstoFile(Dlg.GetPathName());
}

我们来演示功能实现过程
  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索