VC对数据库的操作,通常就是通过ADO、ODBC或DAO方式访问。在最近的工程中,对ADO和ODBC操作数据库有了一定的了解,DAO方式还没有尝试。
下面是通过ODBC访问数据库的操作,ADO方式建立连接时会出现异常。
一、ACCESS->EXCEL
主要思想就是通过CDatabase操作数据库,将ACCESS中的数据读取出来,然后再插入到EXCEL中。代码如下:
二、EXCEL->ACCESS
主要思想是通过CSpreadSheet类读取EXCEL数据,然后将数据插入到ACCESS中,代码如下。其中CSpreadSheet类是专门操作EXCEL数据的类。
下面是通过ODBC访问数据库的操作,ADO方式建立连接时会出现异常。
一、ACCESS->EXCEL
主要思想就是通过CDatabase操作数据库,将ACCESS中的数据读取出来,然后再插入到EXCEL中。代码如下:
//将access数据导入到excel中
void ExportToExcel(CString filename, _RecordsetPtr &resultlist, CWnd *wnd,CString tableName)
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile,sPath;
CString sSql;
_variant_t var;
CString strName,strAge,strWealth;
TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, filename, filename);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 创建表结构
sSql = "CREATE TABLE TestSheet(姓名 TEXT,分数 TEXT,权值 TEXT)";//"CREATE TABLE Sheet1 (序号 TEXT,原始分数 TEXT,人数 TEXT,以下累加人数 TEXT,RP TEXT,Z TEXT,T=10Z+50 TEXT)";
database.ExecuteSQL(sSql);
// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Wealth");
if(var.vt != VT_NULL)
strWealth = (LPCSTR)_bstr_t(var);
sSql = "INSERT INTO TestSheet(姓名,分数,权值)VALUES ('" + strName +"','" +strAge+"','"+strWealth+"')";
database.ExecuteSQL(sSql);
m_pRecordset->MoveNext();
}
//插入数据
// sSql = "INSERT INTO 名单(姓名,分数,权值)VALUES ('ldj','57','28')";
// database.ExecuteSQL(sSql);
}
// 关闭数据库
database.Close();
// AfxMessageBox("数据保存成功!");
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
AfxMessageBox("Excel驱动没有安装!");
}
END_CATCH_ALL;
}
二、EXCEL->ACCESS
主要思想是通过CSpreadSheet类读取EXCEL数据,然后将数据插入到ACCESS中,代码如下。其中CSpreadSheet类是专门操作EXCEL数据的类。
void CExcelAccessDlg::OnOK()
{
CString sExcelFile,sPath,filename = ".\\Demo.mdb",sql;
//弹出对话框选择路径
CFileDialog fileDlg(TRUE, NULL, filename,OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, _T("Excel files (*.xls)|*.xls|"),this);
if( fileDlg.DoModal()==IDOK)
{
sExcelFile = fileDlg.GetPathName(); // 要建立的Excel文件
CFileFind finder;
BOOL bWorking = finder.FindFile(sExcelFile);//寻找文件
}
else return;
CSpreadSheet SS(sExcelFile, "TestSheet");
CStringArray Rows, Column;
//清空列表框
m_AccessList.ResetContent();
for (int i = 2; i <= SS.GetTotalRows(); i++)
{
// 读取一行
SS.ReadRow(Rows, i);
CString strName = "" ,strAge = "", strWealth = "";
strName = Rows.GetAt(0);
strAge = Rows.GetAt(1);
strWealth = Rows.GetAt(2);
sql = "INSERT INTO DemoTable(Name,Age,Wealth)VALUES ('" + strName +"','" +strAge+"','"+strWealth+"')";
insertToAcces(sql,filename);
}
Sleep(2 * 1000);
CDialog::OnOK();
}
void CExcelAccessDlg::insertToAcces(CString sql, CString filename)
{
CDatabase database;
CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)"; // Excel安装驱动
CString sExcelFile,sPath;
CString sSql;
CString strName,strAge,strWealth;
TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, filename, filename);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
database.ExecuteSQL(sql);
}
// 关闭数据库
database.Close();
// AfxMessageBox("数据保存成功!");
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
AfxMessageBox("Excel驱动没有安装!");
}
END_CATCH_ALL;
}