none
vs2010MFC中使用ODBC链接ACCESS数据库,怎样编写查找功能? RRS feed

  • 问题

  • 首先谢谢大家了~

    因为数据库中数据会很多,所以需要用到查找功能来定位相关数据。

    我希望是读取一个EDIT中的数据来查询相应的数据。

        DDX_Control(pDX, IDC_EDIT_FINDIC, m_FindIC);

    这个是我希望输入值得一个CEDIT控件。

    然后在实际操作过程中,我曾经想过用filter来筛选,然后关闭数据库,再重新打开。

        char buff[256];
        char filter[256];
        memset(buff,0,256);
        memset(filter,0,256);
        GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_FINDIC,buff,sizeof(buff)/sizeof(buff[0]));
        memcpy(filter,"[编号]='",16);  //filter是char[]
        strcat(filter,buff);                  //buff是控件读取的char[]
        strcat(filter,"'");
        m_pSet->m_strFilter = filter;
        m_pSet->Requery();
        UpdateData(FALSE);
        m_pSet->m_strFilter = "";
        m_pSet->Close();
        m_pSet->Open();

    此时的确是显示我要的效果,但是如果我这个时候再调用下一项时,发现数据库其实定位在第一项的,调用后显示的是第二项数据。

            m_pSet->MoveNext();
            UpdateData(FALSE);

    后来我又尝试想用OPEN()但是如下程序,效果和使用m_strfilter效果一样。

    void CICPositionMachineView::OnBnClickedButtonCheckfind()
    {
        // TODO: 在此添加控件通知处理程序代码
        char buff[256];
        LPCTSTR wfilter;
        memset(buff,0,256);
        memset(filter,0,256);
        GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_FINDIC,buff,sizeof(buff)/sizeof(buff[0]));
        wfilter = _T("SELECT * FROM [ProductShow] WHERE [编号]='water12345'");
        m_pSet->Close();
        m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, wfilter);
        m_pSet->Requery();
        UpdateData(FALSE);
    }

    因为VS2010中对LPCTSTR,char[]等类型调用相当严格。有些地方我也不是很了解。希望能帮帮忙,

    再次表示感谢。

    2011年7月20日 13:36

答案

  • 我突然发现一个问题,貌似查询定位的话。应该是用遍历对比来查询,原先的想法不对。我先试试看。

    • 已标记为答案 Gavin_Xu 2011年7月21日 1:19
    2011年7月20日 13:56
  •  最后修改的程序下来是这样的。。。

    char buff[256];
     char findic[16];
     BOOL find;
     memset(buff,0,256);
     GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_FINDIC, buff, sizeof(buff)/sizeof(buff[0]));
     if (strlen(buff)>16)
     {
         AfxMessageBox(_T("IC标识码最多16位"));
         m_FindIC.SetFocus();
         m_FindIC.SetSel(0,-1,TRUE);
     }
     else
     {
         find = FALSE;
         memcpy(findic,buff,16);
         m_pSet->MoveFirst();
         SendMessage(WM_UPDATEDATA, FALSE);
         GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_PRODUCTID, buff, 16);
         while(!(m_pSet->IsEOF()) && !(find))
         {
             if(strcmp(buff,findic))
             {
                m_pSet->MoveNext();
                UpdateData(FALSE);
                memset(buff,0,256);
                GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_PRODUCTID, buff, 16);
             }
             else
             { 
                 find = TRUE;
             }
          }
          if(!find)
          {
               AfxMessageBox(_T("无匹配信息"));
          }
     }

    • 已标记为答案 Gavin_Xu 2011年7月26日 2:38
    2011年7月26日 2:38

全部回复

  • 我突然发现一个问题,貌似查询定位的话。应该是用遍历对比来查询,原先的想法不对。我先试试看。

    • 已标记为答案 Gavin_Xu 2011年7月21日 1:19
    2011年7月20日 13:56
  • 你好,

     

    很高兴你能够在MSDN论坛中提出您的问题,并且通过自己的努力尝试解决问题。我们期待您的回答,并与我们分享您的解决方案。谢谢


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月22日 7:24
  •  最后修改的程序下来是这样的。。。

    char buff[256];
     char findic[16];
     BOOL find;
     memset(buff,0,256);
     GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_FINDIC, buff, sizeof(buff)/sizeof(buff[0]));
     if (strlen(buff)>16)
     {
         AfxMessageBox(_T("IC标识码最多16位"));
         m_FindIC.SetFocus();
         m_FindIC.SetSel(0,-1,TRUE);
     }
     else
     {
         find = FALSE;
         memcpy(findic,buff,16);
         m_pSet->MoveFirst();
         SendMessage(WM_UPDATEDATA, FALSE);
         GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_PRODUCTID, buff, 16);
         while(!(m_pSet->IsEOF()) && !(find))
         {
             if(strcmp(buff,findic))
             {
                m_pSet->MoveNext();
                UpdateData(FALSE);
                memset(buff,0,256);
                GetDlgItemTextA(GetSafeHwnd(), IDC_EDIT_PRODUCTID, buff, 16);
             }
             else
             { 
                 find = TRUE;
             }
          }
          if(!find)
          {
               AfxMessageBox(_T("无匹配信息"));
          }
     }

    • 已标记为答案 Gavin_Xu 2011年7月26日 2:38
    2011年7月26日 2:38