工控编程吧
标题:
306上位机VC MFC使用ADO进行音频文档文件的保存与读取
[打印本页]
作者:
qq263946146
时间:
2016-9-24 14:00
标题:
306上位机VC MFC使用ADO进行音频文档文件的保存与读取
(, 下载次数: 2)
上传
点击文件名下载附件
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());
}
我们来演示功能实现过程
[iqiyi]http://player.video.qiyi.com/df9c92d008fc1435d12219f563ce803d/0/0/w_19rsuau315.swf-albumId=6384323509-tvId=6384323509-isPurchase=0-cnId=12[/iqiyi]
[weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4