#include "stdafx.h"
#include "Fiber.h"
#include "FiberDlg.h"
#include "afxdialogex.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()
// CFiberDlg 对话框
CFiberDlg::CFiberDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CFiberDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CFiberDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CFiberDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_CANCEL, &CFiberDlg::OnBnClickedButtonCancel)
ON_BN_CLICKED(IDC_BUTTON_ADD, &CFiberDlg::OnBnClickedButtonAdd)
ON_BN_CLICKED(IDC_BUTTON_SAVE, &CFiberDlg::OnBnClickedButtonSave) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_FIBER, &CFiberDlg::OnLvnItemchangedListFiber)
END_MESSAGE_MAP()
// CFiberDlg 消息处理程序BOOL CFiberDlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码
::CoInitialize(NULL);
m_FiberList.SetExtendedStyle(m_FiberList.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_FiberList.InsertColumn(0, _T("光纤段"), LVCFMT_LEFT, 100);
m_FiberList.InsertColumn(1, _T("温度"), LVCFMT_LEFT, 120);
m_FiberList.InsertColumn(2, _T("距离"), LVCFMT_LEFT, 100);
EnableInput(FALSE);
m_bADD = FALSE;

_bstr_t strcnn(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data source=Fiber.mdb"));
try
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open(strcnn,  _T(""), _T(""), adModeUnknown);
m_pRecordset.CreateInstance(__uuidof(Recordset));
}
catch(_com_error e)
{
AfxMessageBox(_T("建立数据库失败!"), MB_OK|MB_ICONSTOP);
}
FreshList();
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CFiberDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CFiberDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
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 CFiberDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CFiberDlg::OnBnClickedButtonAdd()
{
// TODO: 在此添加控件通知处理程序代码
m_bADD = TRUE;
EnableInput(TRUE);
}
void CFiberDlg::OnBnClickedButtonSave()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if(m_strId.IsEmpty())
{
AfxMessageBox(_T("光纤段不能为空."));
return;
}
if(m_strData.IsEmpty())
{
AfxMessageBox(_T("温度不能为空."));
return;
}
CString strSql;
strSql.Format(_T("Insert into TTempData values('%s','%s',%s)"), m_strId, m_strData, m_strXscale);
try
{
m_pConnection->Execute(_bstr_t(strSql), 0, adCmdText);
}
catch(_com_error e)
{
AfxMessageBox(_T("增加记录失败!"));
}
AfxMessageBox(_T("增加记录成功!"));
FreshList(); m_bADD = FALSE;
EnableInput(FALSE);
}
void CFiberDlg::OnBnClickedButtonCancel()
{
// TODO: 在此添加控件通知处理程序代码
m_bADD = FALSE;
EnableInput(FALSE);
}
void CFiberDlg::EnableInput(BOOL bEnable)
{
CEdit *pEdit;
CButton *pButton; pEdit = (CEdit*)GetDlgItem(IDC_EDIT_ID);
pEdit->SetReadOnly(bEnable);

pEdit = (CEdit*)GetDlgItem(IDC_EDIT_DATA);
pEdit->SetReadOnly(!bEnable);

pEdit = (CEdit*)GetDlgItem(IDC_EDIT_XSCALE);
pEdit->SetReadOnly(!bEnable);

pButton =(CButton*)GetDlgItem(IDC_BUTTON_ADD);
pButton->EnableWindow(!bEnable); pButton =(CButton*)GetDlgItem(IDC_BUTTON_SAVE);
pButton->EnableWindow(bEnable); pButton =(CButton*)GetDlgItem(IDC_BUTTON_CANCEL);
pButton->EnableWindow(bEnable);
}void CFiberDlg::FreshList()
{
try
{
m_pRecordset->Open(_T("SELECT * FORM TTempData"), (IDispatch*)m_pConnection,\
   adOpenDynamic,adLockOptimistic,adCmdText);
int nItem;
m_FiberList.DeleteAllItems();
while(!m_pRecordset->adoEOF)
{
nItem = m_FiberList.GetItemCount();
CString str;
str=(LPCTSTR)_bstr_t(m_pRecordset->GetCollect("ID"));
m_FiberList.InsertItem(nItem, str);
str=(LPCTSTR)_bstr_t(m_pRecordset->GetCollect("Data"));
m_FiberList.SetItemText(nItem, 1, str);
str=(LPCTSTR)_bstr_t(m_pRecordset->GetCollect("Xscale"));
m_FiberList.SetItemText(nItem, 2, str);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}
catch(_com_error e)
{
AfxMessageBox(_T("刷新列表失败!"));
}
}void CFiberDlg::OnLbnSelchangeListFiber()
{ // TODO: 在此添加控件通知处理程序代码
int nItem = m_FiberList.GetSelectionMark();
if(nItem == -1) return;
m_strId = m_FiberList.GetItemText(nItem, 0);
m_strData = m_FiberList.GetItemText(nItem, 1);
m_strXscale = m_FiberList.GetItemText(nItem, 2);
UpdateData(FALSE);
}void CFiberDlg::OnLvnItemchangedListFiber(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
}

解决方案 »

  1.   

    strSql.Format(_T("Insert into TTempData values('%s','%s',%s)"), m_strId, m_strData, m_strXscale);
    这句是不是少个'',就是第三个%s,是不是应该是这样:
    strSql.Format(_T("Insert into TTempData values('%s','%s','%s')"), m_strId, m_strData, m_strXscale);
      

  2.   

    strSql.Format(_T("Insert into TTempData values('%s','%s',%s)"), m_strId, m_strData, m_strXscale);
    这样的风格不好,特别是你的数据库表如果发生变动,你的代码修改难度很大,且易出错. 而且只看见你Insert数据表没Update数据表.
      

  3.   

    [Quote=引用 1 楼 toucheme 的回复:]
    lz,你好歹也写出你想要的结果是什么吧?
    我想把数据库里的数据读出来并显示在ListCtrl控件里边,只是总是出现“数据刷新失败!”而无法把数据库里的内容显示出来
      

  4.   

    [Quote=引用 4 楼 hujun614 的回复:]
    strSql.Format(_T("Insert into TTempData values('%s','%s',%s)"), m_strId, m_strData, m_strXscale);
    这样的风格不好,特别是你的数据库表如果发生变动,你的代码修改难度很大,且易出错. 而且只看见你Insert数据表没Update数据表.
    谢谢啊,如果这种风格不好的话要用哪一个会好些呢,嗯,我出现的问题就是  刷新列表失败 也就是因此而不能把数据表的数据读出来的
      

  5.   

    _bstr_t strcnn(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data source=Fiber.mdb"));
    你这句的代码是OFFICE2010的数据库,你计算机上装的OFFICE是不是OFFICE2010,如果不是OFFICE2010就不对了,按你说的提示信息,是数据库打开失败,也就是在:
    m_pRecordset->Open(_T("SELECT * FORM TTempData"), (IDispatch*)m_pConnection,\
    adOpenDynamic,adLockOptimistic,adCmdText);这句出错,否则不能出"数据刷新失败!"的提示,也就是不能进入:
    catch(_com_error e)
    {
    AfxMessageBox(_T("刷新列表失败!"));
    }
    这里,你单步执行,看看是不是open这句出错才进的catch里
      

  6.   

    谢谢hdg3707
    我的OFFICE是OFFICE2007的我把_bstr_t strcnn(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data source=Fiber.mdb"));这句代码改为_bstr_t strcnn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source=Fiber.mdb"));结果也还是一样的。我出错的是刷新列表失败,数据库读取上是可以的。如果是m_pRecordset->Open(_T("SELECT * FORM TTempData"), (IDispatch*)m_pConnection,\
    adOpenDynamic,adLockOptimistic,adCmdText);这句代码出错的话,该如何改呢,请赐教,谢谢
      

  7.   

    在初始化函数加上:
    AfxOleInit();//其实::CoInitialize(NULL);这句就行了,但你还是把AfxOleInit();加上试试
    我给你段代码,是好使的:
    try   
      {   
      m_pConnection=NULL;
      hr   =   m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象   
      if(SUCCEEDED(hr))   
      {   
      m_pConnection->ConnectionTimeout   =   10;   
      hr   =   m_pConnection->Open(   "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\bagayalu.accdb","", "", adModeUnknown);
    //  hr   =   m_pConnection->Open(   "Provider=Microsoft.Ace.Oledb.12.0;Data Source=D:\\bagayalu.accdb;Jet OLEDB:Database Password=BayAlu良心大大的坏了的","", "", adModeUnknown);
      hr =m_pConnection->Open( (_bstr_t)str,"", "", adModeUnknown);
          
      m_pCommand.CreateInstance(__uuidof(Command));   
      m_pCommand->CommandTimeout   =   5;   
      m_pCommand->ActiveConnection   =   m_pConnection;   
      }
      else
      {
      AfxMessageBox("打开数据库失败");
       Result=FALSE;
     return Result;
      }
      }   
      catch(_com_error   e)///捕捉异常   
      {   
      CString   errormessage;   
      errormessage.Format("连接数据库失败!/r/n错误信息:%s",e.ErrorMessage());   
    //  AfxMessageBox(errormessage);///显示错误信息   
      Result=FALSE;
      return Result;
      } 
    _variant_t   var;
    float v1,v2,v3,v4;
    CString Re;
    m_pRecordset.CreateInstance(__uuidof(Recordset));
    try   
      {   
      m_pRecordset->Open("SELECT * FROM data1",//   查询DemoTable表中所有字段   
      m_pConnection.GetInterfacePtr(),//   获取库接库的IDispatch指针   
      adOpenDynamic,
      adLockOptimistic,
      adCmdText);
      while(!m_pRecordset->adoEOF)   
      {   
      var   =   m_pRecordset->GetCollect("v1");   
      if(var.vt   !=   VT_NULL)
      v1=var.fltVal;
    //  strName   =   (LPCSTR)_bstr_t(var);      var   =   m_pRecordset->GetCollect("v2");   
      if(var.vt   !=   VT_NULL)   
      v2=var.fltVal;
      var   =   m_pRecordset->GetCollect("v3");   
      if(var.vt   !=   VT_NULL)   
      v3=var.fltVal;
      var   =   m_pRecordset->GetCollect("v4");   
      if(var.vt   !=   VT_NULL)   
      v4=var.fltVal;
      var   =   m_pRecordset->GetCollect("re");   
      if(var.vt   !=   VT_NULL)
    Re   =   (LPCSTR)_bstr_t(var);
      m_pRecordset->MoveNext();   
      } 
      } 
      catch(_com_error   *e)   
      {   
      Result=FALSE;
     return Result;
    //  AfxMessageBox(e->ErrorMessage());   
      }
    在头文件里定义:
    #import   "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename   ("EOF",   "adoEOF")_ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;
    _CommandPtr m_pCommand;
      

  8.   

    hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\bagayalu.mdb","", "", adModeUnknown);
    数据库是D:\\bagayalu.mdb,上面的是OFFICE2010版本的
      

  9.   

    谢谢热心的hdg3707
    我试过了可还是会出错,要不你给我下你的邮箱我吧我的整个程序代码及数据库一同给你发过去,你帮我看看行吧,我非常想知道结果的,谢谢
      

  10.   

    hdg3707
    我前天就已经把代码和数据库发你邮箱了,帮忙看一下吧,因为是毕业论文,比较急,非常非常感谢!!