当前位置: 开源爱好者 » 编程教程 » VC++教程 » 正文

VC++ SQL 语句嵌套

VC++ SQL 语句嵌套,嵌套的SQL 语句可以执行比较复杂的数据库操作,本例介绍在INSERT 语句中嵌套使用SELECT语句。通过控制面板注册Access 数据源students,编译并运行本例程序,左右列表框分别显示的table1 和table2 两个表的内容。table2 是空的,结构和table1 相同。单击【备份】按钮,将table1 的数据完全拷贝到table2,实现思路:嵌套的SQL 语句如下:

insert into table2(id, name, entertm, leavetm, comment) select id, name, entertm, leavetm, comment from table1

表示将表table1 的数据完全拷贝到table2 中。程序代码的编写:
(1)使用上例的数据源,并增加一个和table1 结构完全一样的空表table2。
(2)通过AppWizard 生成基于对话框的应用程序SqlNesting。
(3)给对话框增加两个CListBox 控件,分别用来显示table1 表和table2 表的内容,并通过ClassWizard 生成分别对应的CListBox 类型变量m_Lst1 和m_Lst2。
(4)在stdafx.h 文件中用#import 引入ADO 库文件,其代码如下:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
rename("BOF","FirstOfFile")
#include "ICRSINT.H"

(5)给对话框类声明数据库连接和记录集的成员变量。

_ConnectionPtr m_pCon; //连接对象
_RecordsetPtr m_pRs; //记录集对象

(6)在对话框的OnInitDialog 函数中打开数据库,并显示两个表的数据,其代码如下:

BOOL CSqlNestingDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//初始化环境
::CoInitialize(NULL);
//创建并打开数据库连接对象
_variant_t vFieldValue;
CString strFieldValue;
m_pCon.CreateInstance(__uuidof(Connection));
m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=students.mdb","","",NULL);
//创建并打开记录集对象
m_pRs.CreateInstance(__uuidof(Recordset));
//获得表table1 的数据
m_pRs->Open("select* from table1",m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
while(VARIANT_FALSE == m_pRs->EndOfFile)
{
CString strItem;
vFieldValue = m_pRs->GetCollect("id");
strFieldValue = (char*)_bstr_t(vFieldValue);
strItem = strFieldValue;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strFieldValue = (char*)_bstr_t(vFieldValue);
strItem += " " + strFieldValue;
vFieldValue.Clear();
m_Lst1.AddString(strItem);
m_pRs->MoveNext();
}
//获得表table2 的数据
m_pRs->Close();
m_pRs->Open("select* from table2",m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
while(VARIANT_FALSE == m_pRs->EndOfFile)
{
CString strItem;
vFieldValue = m_pRs->GetCollect("id");
strFieldValue = (char*)_bstr_t(vFieldValue);
strItem = strFieldValue;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strFieldValue = (char*)_bstr_t(vFieldValue);
strItem += " " + strFieldValue;
vFieldValue.Clear();
m_Lst2.AddString(strItem);
m_pRs->MoveNext();
}
return TRUE; 
}

(7)给对话框增加备份的按钮,其响应函数如下:

void CSqlNestingDlg::OnBackup()
{
//清空table2
m_pCon->Execute("delete * from table2", NULL, adOptionUnspecified);
m_Lst2.ResetContent(); //清空IDC_LIST2 控件
MessageBox("table2 已被清空!");
//构造嵌套SQL 语句
CString str1 = "insert into table2 (id,name,entertm,leavetm,comment)";
CString str2 = "select id,name,entertm,leavetm,comment from table1";
CString strSql = str1 + str2;
//将table1 备份到table2
m_pCon->Execute(strSql.AllocSysString(),NULL,adOptionUnspecified);
//从新获得表table2 的数据
_variant_t vFieldValue;
CString strFieldValue;
m_pRs->Close();
m_pRs->Open("select* from table2",m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
while(VARIANT_FALSE == m_pRs->EndOfFile)
{
CString strItem;
vFieldValue = m_pRs->GetCollect("id");
strFieldValue = (char*)_bstr_t(vFieldValue);
strItem = strFieldValue;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strFieldValue = (char*)_bstr_t(vFieldValue);
strItem += " " + strFieldValue;
vFieldValue.Clear();
m_Lst2.AddString(strItem);
m_pRs->MoveNext();
}
MessageBox("完成table1 到table2 的备份。");
}

(8)响应对话框的WM_DESTROY 消息,关闭数据库等,其代码如下:

void CSearchByStrDlg::OnDestroy()
{
//关闭记录和连接
m_pRs->Close();
m_pCon->Close();
//释放环境
::CoUninitialize();
CDialog::OnDestroy();
}

CopyRight 2018© 开源爱好者 All Rights Reserved 豫ICP备16030607号 隐私声明 网站地图