一、环境配置
映入ADO动态库:#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile") rename("BOF","FirstOfFile")
二、软件界面
三、源码
// testDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "test.h"
#include "testDlg.h"
#include "afxdialogex.h"
#include "UpdateData.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CtestDlg 对话框
CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CtestDlg::IDD, pParent)
, m_sip(_T(""))
, m_sDatabaseName(_T(""))
, m_sUserID(_T(""))
, m_sPasswd(_T(""))
, m_sPort(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CtestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Control(pDX, IDC_EDIT_IP, m_ip);
DDX_Control(pDX, IDC_EDIT_DATABASE_NAME, m_databaseName);
DDX_Control(pDX, IDC_EDIT_USER_ID, m_userID);
DDX_Control(pDX, IDC_EDIT_PASSWD, m_passwd);
DDX_Text(pDX, IDC_EDIT_IP, m_sip);
DDX_Text(pDX, IDC_EDIT_DATABASE_NAME, m_sDatabaseName);
DDX_Text(pDX, IDC_EDIT_USER_ID, m_sUserID);
DDX_Text(pDX, IDC_EDIT_PASSWD, m_sPasswd);
DDX_Control(pDX, IDC_EDIT_PORT, m_port);
DDX_Text(pDX, IDC_EDIT_PORT, m_sPort);
}
BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_CONNECT, &CtestDlg::OnBnClickedBtnConnect)
ON_BN_CLICKED(IDC_BTN_QUERY, &CtestDlg::OnBnClickedBtnQuery)
ON_BN_CLICKED(IDC_BTN_ADD, &CtestDlg::OnBnClickedBtnAdd)
ON_BN_CLICKED(IDC_BTN_DELETE, &CtestDlg::OnBnClickedBtnDelete)
ON_BN_CLICKED(IDC_BTN_MODIFY, &CtestDlg::OnBnClickedBtnModify)
END_MESSAGE_MAP()
// CtestDlg 消息处理程序
BOOL CtestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
//1. 初始化界面
iniUI();
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CtestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CtestDlg::OnQueryDragIcon()
{
return static_cast
}
void CtestDlg::iniUI()
{
//1. 设置数据库连接的默认值
m_ip.SetWindowTextW(L"192.168.0.145");
m_databaseName.SetWindowTextW(L"LeiMan");
m_userID.SetWindowTextW(L"sc");
m_passwd.SetWindowTextW(L"000000");
m_port.SetWindowTextW(L"1433");
//2. 没连接数据库之前 不允许 查询、增加、删除、修改数据
(CButton*)GetDlgItem(IDC_BTN_QUERY)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_BTN_ADD)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_BTN_DELETE)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_BTN_MODIFY)->EnableWindow(FALSE);
//3. 设置列表的属性
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER;
m_list.SetExtendedStyle(dwStyle);
m_list.GetHeaderCtrl()->EnableWindow(0);
}
//连接数据库
void CtestDlg::OnBnClickedBtnConnect()
{
//1. 创建Connection对象
m_pConnection.CreateInstance(_uuidof(Connection));
m_pRecordSet.CreateInstance(_uuidof(Recordset));
m_pCommand.CreateInstance(_uuidof(Command));
m_pConnection->ConnectionTimeout = 1; //设置连接时间
//m_pConnection->CommandTimeout = 1;
//TRACE("%s\n",m_sConn);
//2. 连接数据库
try
{
//2.1 把界面 用户输入 IP、账户、密码、端口号和数据库名称 更新到关联变量
UpdateData(TRUE);
//2.2 拼接成 登录 数据的 字符串
CString sConncet;
//sConncet.Format(L"Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%s", m_sPasswd, m_sUserID, m_sDatabaseName, m_sip, m_sPort);
//sConncet.Format(L"driver={SQL Server};Server=%s,%s;DATABASE=%s;UID=%s;PWD=%s", m_sip, m_sPort, m_sDatabaseName, m_sUserID, m_sPasswd);
//sConncet.Format(L"driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s", m_sip, m_sDatabaseName, m_sUserID, m_sPasswd);
//sConncet.Format(L"Persist Security Info=False;Integrated Security=SSPI;database=LeiMan;server=mkjj;Connect Timeout=1");
//sConncet.Format(L"driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s", m_sip, m_sDatabaseName, m_sUserID, m_sPasswd);
sConncet.Format(L"Provider=SQLNCLI10;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%s", m_sPasswd, m_sUserID, m_sDatabaseName, m_sip, m_sPort);
_bstr_t strConnect(sConncet);
//2.3 登录数据库
if (m_pConnection->State) m_pConnection->Close(); //如果已经打开了连接则关闭它
//HRESULT hr = m_pConnection->Open(strConnect, _bstr_t(m_sUserID), _bstr_t(m_sPasswd), adModeUnknown);
HRESULT hr = m_pConnection->Open(_bstr_t(_T("Provider=SQLNCLI10;Server=192.168.0.145,1433;Database=LeiMan;Uid=sc; Pwd=000000;")), _bstr_t(_T("sc")), _bstr_t(_T("000000")), adOpenUnspecified);
if (FAILED(hr))
{
//2.4 登录失败 时 提示用户
MessageBox(L"连接数据库失败!", MB_OK, MB_ICONERROR);
return ;
}
else
{
//2.5 登录成功 把m_pRecordSet 与 m_pConnection关联,方便后面进行增删改查
m_pCommand->PutActiveConnection(_variant_t(m_pConnection.GetInterfacePtr()));
m_pCommand->CommandType = adCmdText;
//2.6 提示用户登录数据库成功 并把增删改查按钮 设置为可点击
MessageBox(L"连接数据库成功!", MB_OK, MB_ICONASTERISK);
(CButton*)GetDlgItem(IDC_BTN_QUERY)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_BTN_ADD)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_BTN_DELETE)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_BTN_MODIFY)->EnableWindow(TRUE);
}
UpdateData(FALSE);
}
catch(_com_error e)
{
//3.1 出现异常时 提示用户异常的原因
MessageBox(e.Description(), MB_OK, MB_ICONERROR);
return ;
}
}
void CtestDlg::OnBnClickedBtnQuery()
{
try
{
int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount();
for (int i = nColumnCount - 1; i >= 0; i--) m_list.DeleteColumn(i);
m_list.DeleteAllItems();
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER;
m_list.SetExtendedStyle(dwStyle);
clock_t start = clock();
//1. 先查出最早的时间
m_pCommand->CommandText = _bstr_t("SELECT TOP (1) 操作时间 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') order by 操作时间 desc");
_RecordsetPtr pRet = m_pCommand->Execute(NULL, NULL, adCmdText);
//2. 取出所有查询结果
CString sTime;
int iCount = pRet->Fields->Count; //得到字段的总数
while (!pRet->EndOfFile)
{
//3.1 取其他字段的值
for (int i = 0; i < iCount; i++)
{
FieldPtr fieldCtl = pRet->Fields->GetItem(long(i));
_variant_t varValue = fieldCtl->Value;
_bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);
sTime = bstrValue.GetBSTR();
}
pRet->MoveNext();
}
pRet->Close();
//3. 查询数据 sTime = ""
CString sSql;
sSql.Format(L"SELECT x坐标, y坐标 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') AND 操作时间='%s'", sTime);
m_pCommand->CommandText = _bstr_t(sSql);
pRet = m_pCommand->Execute(NULL, NULL, adCmdText);
clock_t finish = clock();
float duration = (double)(finish - start) / CLOCKS_PER_SEC;
TRACE("查询一条数据花费的时间:%f\r\n", duration);
//3. 取出所有查询结果
iCount = pRet->Fields->Count; //得到字段的总数
m_list.InsertColumn(0, L"序号", LVCFMT_CENTER, 80);
for (int i = 0; i < iCount; i++)
{
FieldPtr fieldCtl = pRet->Fields->GetItem(long(i)); //得到字段名控件
m_list.InsertColumn(i+1, fieldCtl->Name, LVCFMT_CENTER, 80);
}
int iSize = 0;
while (!pRet->EndOfFile)
{
//3.1 取其他字段的值
char buf[1024] = {0};
int iRow = m_list.GetItemCount();
int iIndex = m_list.InsertItem(iRow, CString(itoa(iRow+1, buf, 10)));
for (int i = 0; i < iCount; i++)
{
FieldPtr fieldCtl = pRet->Fields->GetItem(long(i));
_variant_t varValue = fieldCtl->Value;
_bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);
m_list.SetItemText(iIndex, i+1, bstrValue);
}
//3.2 准备处理下一条记录
iSize++;
if (iSize == 10000) break;
pRet->MoveNext();
}
pRet->Close();
autoAdjustColumnWidth(&m_list);
}
catch (_com_error e)
{
MessageBox(e.Description(), MB_OK, MB_ICONERROR);
//TRACE(_T("Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
}
//查询数据
//void CtestDlg::OnBnClickedBtnQuery()
//{
// try
// {
// int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount();
// for (int i = nColumnCount - 1; i >= 0; i--) m_list.DeleteColumn(i);
// m_list.DeleteAllItems();
//
// DWORD dwStyle = m_list.GetExtendedStyle();
// dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER;
// m_list.SetExtendedStyle(dwStyle);
//
// clock_t start = clock();
//
// clock_t start2 = clock();
//
//
// //1. 执行查询,得到结果集于m_pRecordSet中
// m_pCommand->CommandText = _bstr_t("SELECT x坐标, y坐标 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') AND \
// 操作时间=(SELECT TOP (1) 操作时间 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') order by 操作时间 desc)");
//
// //m_pCommand->CommandText = _bstr_t("SELECT x坐标, y坐标 FROM aaa WHERE 1 = 2");
// //m_pCommand->CommandText = _bstr_t("select 操作时间 from aaa where 工序='固晶' and 条码='6923450656181' order by 操作时间 desc");
// //m_pCommand->CommandText = _bstr_t("select * from aaa where 工序='固晶' and 条码='6923450656181' order by 操作时间 desc");
//
// //m_pCommand->CommandText = _bstr_t("select * from COB");
//
// //m_pCommand->ActiveConnection = m_pConnection;
// //m_pCommand->CommandType = adCmdText;
// _RecordsetPtr pRet = m_pCommand->Execute(NULL, NULL, adCmdText);
//
// clock_t finish2 = clock();
// float duration2 = (double)(finish2 - start2) / CLOCKS_PER_SEC;
// TRACE("查询数据花费的时间:%f\r\n", duration2);
//
// if (pRet->EndOfFile)
// {
// AfxMessageBox(L"查询数据错误", MB_OK, MB_ICONERROR);
// return ;
// }
//
// //2. 根据结果集,重新设置列标题
// int iCount = pRet->Fields->Count; //得到字段的总数
// m_list.InsertColumn(0, L"序号", LVCFMT_CENTER, 80);
// for (int i = 0; i < iCount; i++)
// {
// FieldPtr fieldCtl = pRet->Fields->GetItem(long(i)); //得到字段名控件
// m_list.InsertColumn(i+1, fieldCtl->Name, LVCFMT_CENTER, 80);
// }
//
// //3. 取出所有查询结果
// int iSize = 0;
// while (!pRet->EndOfFile)
// {
// //3.1 取其他字段的值
// char buf[1024] = {0};
// int iRow = m_list.GetItemCount();
// int iIndex = m_list.InsertItem(iRow, CString(itoa(iRow+1, buf, 10)));
// for (int i = 0; i < iCount; i++)
// {
// FieldPtr fieldCtl = pRet->Fields->GetItem(long(i));
// _variant_t varValue = fieldCtl->Value;
// _bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);
//
// m_list.SetItemText(iIndex, i+1, bstrValue);
// }
//
// //3.2 准备处理下一条记录
// iSize++;
// if (iSize == 10000) break;
// pRet->MoveNext();
// }
//
// clock_t finish = clock();
// float duration = (double)(finish - start) / CLOCKS_PER_SEC;
// TRACE("查询一条数据花费的时间:%f\r\n", duration);
//
// pRet->Close();
// autoAdjustColumnWidth(&m_list);
// }
// catch (_com_error e)
// {
// MessageBox(e.Description(), MB_OK, MB_ICONERROR);
// //TRACE(_T("Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
// }
//}
//查询数据2
//void CtestDlg::OnBnClickedBtnQuery()
//{
// try
// {
// int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount();
// for (int i = nColumnCount - 1; i >= 0; i--) m_list.DeleteColumn(i);
// m_list.DeleteAllItems();
//
// //1. 执行查询,得到结果集于m_pRecordSet中
// if (m_pRecordSet->State) m_pRecordSet->Close();
// HRESULT hr = m_pRecordSet->Open("select * from aaa", m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
//
// if (FAILED(hr))
// {
// AfxMessageBox(L"查询数据错误", MB_OK, MB_ICONERROR);
// return ;
// }
//
// //2. 根据结果集,重新设置列标题
// int iCount = m_pRecordSet->Fields->Count; //得到字段的总数
// m_list.InsertColumn(0, L"序号", LVCFMT_CENTER, 80);
// for (int i = 0; i < iCount; i++)
// {
// FieldPtr fieldCtl = m_pRecordSet->Fields->GetItem(long(i)); //得到字段名控件
// m_list.InsertColumn(i+1, fieldCtl->Name, LVCFMT_CENTER, 80);
// }
//
// //3. 取出所有查询结果
// while (!m_pRecordSet->EndOfFile)
// {
// //3.1 取其他字段的值
// char buf[1024] = {0};
// int iRow = m_list.GetItemCount();
// int iIndex = m_list.InsertItem(iRow, CString(itoa(iRow, buf, 10)));
// for (int i = 0; i < iCount; i++)
// {
// FieldPtr fieldCtl = m_pRecordSet->Fields->GetItem(long(i));
// _variant_t varValue = fieldCtl->Value;
// _bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);
//
// m_list.SetItemText(iIndex, i+1, bstrValue);
// }
//
// //3.2 准备处理下一条记录
// m_pRecordSet->MoveNext();
// }
//
// //m_pRecordSet->Close();
// autoAdjustColumnWidth(&m_list);
// }
// catch (_com_error e)
// {
// MessageBox(e.Description(), MB_OK, MB_ICONERROR);
// }
//}
//使表格内容自适应宽度
void CtestDlg::autoAdjustColumnWidth(CListCtrl* pListCtrl)
{
if (pListCtrl == NULL) return;
pListCtrl->SetRedraw(FALSE);
CHeaderCtrl *pHeader = pListCtrl->GetHeaderCtrl();
int nColumnCount = pHeader->GetItemCount();
for(int i = 0; i < nColumnCount; i++)
{
pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE);
int nColumnWidth = pListCtrl->GetColumnWidth(i);
pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
int nHeaderWidth = pListCtrl->GetColumnWidth(i);
pListCtrl->SetColumnWidth(i, max(nColumnWidth, nHeaderWidth)+5);
}
pListCtrl->SetRedraw(TRUE);
}
//增加数据
void CtestDlg::OnBnClickedBtnAdd()
{
CUpdateData dlg(this);
dlg.DoModal();
}
//删除数据
void CtestDlg::OnBnClickedBtnDelete()
{
USES_CONVERSION;
//1. 获取当前用户要删除的行号
POSITION pos = m_list.GetFirstSelectedItemPosition();
int iRow = m_list.GetNextSelectedItem(pos);
if (iRow < 0)
{
MessageBox(L"请选择要删除的行", MB_OK, MB_ICONERROR);
return;
}
try
{
CString sSql;
//2. 把要删除那一条数据 的 每个字段名 和 字段值 从界面列表取出来
int iCols = m_list.GetHeaderCtrl()->GetItemCount();
for (int i = 1; i < iCols; i++)
{
//3.1
CString sText = m_list.GetItemText(iRow, i);
//4. 取字段名
HDITEMW te;
TCHAR lpBuffer[256] = {0};
te.mask = HDI_TEXT;
te.pszText = lpBuffer;
te.cchTextMax = 256;
m_list.GetHeaderCtrl()->GetItem(i, &te);
//5. 把字段名 和 字段值 拼接SQL语句
CString sTemp;
CString sTitle(lpBuffer);
sTemp.Format(i == iCols - 1 ? L"%s='%s'" : L"%s='%s' and ", sTitle, sText);
sSql += sTemp;
}
sSql = L"delete from aaa where " + sSql;
//5. 执行删除语句 从 数据库 删除用户选择的 那一条数据
m_pCommand->CommandText = _bstr_t(sSql);
//m_pCommand->CommandType = adCmdText;
//m_pCommand->ActiveConnection = m_pConnection;
_RecordsetPtr pRet = m_pCommand->Execute(NULL, NULL, adCmdText);
if (m_pConnection->Errors > 0)
{
//提示用户删除成功
AfxMessageBox(L"删除数据成功!", MB_OK, MB_ICONASTERISK);
//更新界面数据
OnBnClickedBtnQuery();
}
else
{
AfxMessageBox(L"删除数据失败!", MB_OK, MB_ICONERROR);
}
//m_pRecordSet->Delete(adAffectCurrent);
}
catch (_com_error e)
{
MessageBox(e.Description(), MB_OK, MB_ICONERROR);
}
}
//删除数据2
//void CtestDlg::OnBnClickedBtnDelete()
//{
// USES_CONVERSION;
//
// //1. 获取当前用户要删除的行号
// POSITION pos = m_list.GetFirstSelectedItemPosition();
// int iRow = m_list.GetNextSelectedItem(pos);
// if (iRow < 0)
// {
// MessageBox(L"请选择要删除的行", MB_OK, MB_ICONERROR);
// return;
// }
//
// try
// {
// CString sSql;
//
// //2. 把要删除那一条数据 的 每个字段名 和 字段值 从界面列表取出来
// int iCols = m_list.GetHeaderCtrl()->GetItemCount();
// for (int i = 1; i < iCols; i++)
// {
// //3.1
// CString sText = m_list.GetItemText(iRow, i);
//
// //4. 取字段名
// HDITEMW te;
// TCHAR lpBuffer[256] = {0};
// te.mask = HDI_TEXT;
// te.pszText = lpBuffer;
// te.cchTextMax = 256;
// m_list.GetHeaderCtrl()->GetItem(i, &te);
//
// //5. 把字段名 和 字段值 拼接SQL语句
// CString sTemp;
// CString sTitle(lpBuffer);
// sTemp.Format(i == iCols - 1 ? L"%s='%s'" : L"%s='%s' and ", sTitle, sText);
//
// sSql += sTemp;
// }
// sSql = L"delete from aaa where " + sSql;
//
// //5. 执行删除语句 从 数据库 删除用户选择的 那一条数据
// if (m_pRecordSet->State) m_pRecordSet->Close();
// HRESULT hr = m_pRecordSet->Open(sSql.GetBuffer(), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
// if (SUCCEEDED(hr))
// {
// //更新界面数据
// OnBnClickedBtnQuery();
//
// //提示用户删除成功
// AfxMessageBox(L"删除数据成功!", MB_OK, MB_ICONASTERISK);
// }
// else
// {
// AfxMessageBox(L"删除数据失败!", MB_OK, MB_ICONERROR);
// }
// }
// catch (_com_error e)
// {
// MessageBox(e.Description(), MB_OK, MB_ICONERROR);
// }
//}
//修改数据
void CtestDlg::OnBnClickedBtnModify()
{
}
四、测试结果