MFC ---- Sql server odbc, list control, HTTP POST MES,c++保存本地数据库,界面显示。

1,二维码扫码枪扫码 2,使用了串口通信 3,socket通信 4,sql server 2008r2安装,数据库的增删改查,ODBC建立数据源 5,HTTP POST到web services****

1,扫码本质就是一个字符串,使用一个编辑框接收数据就好了。

2,串口通讯,设置好串口需要的参数,读取数据时注意分段接收,做死循环等待接收的时候记得做超时。可以使用conut = 18000; count --; while(count > 0)
(1) int 代表一个整形
而二进制 10进制 16进制 都是一种表示的方式

int a=0c;
			int b=0f;
			int c = (a<<8 | b);

就代表0c0f;

(2)int和char 互相转换 : atoi itoa
float和char 互相转换 : atof sprintf
_ttoi CString 转int

(3)strtok 分离字符串
strstr 查找字符串里是否有子字符串

(4)CString 转 char可以用sprintf
CString转int float 都可以用Format

(5)memset 清0初始化
memcpy内存拷贝 可以将unsigned char 连接起来

(6)CTime获取时间
CTimeSpan获取时间差

(7)UNICODE CString 转char

	CString str;
	int n = str.GetLength();
	int len = WideCharToMultiByte(CP_ACP, 0, str, str.GenLength(), null, 0, null, null);
	char * buf = new char[len+1];
	WideCharToMultiByte(CP_ACP, 0, str, str.GenLength(), buf, len, null, null);

(8)m_pMainWnd = (CBaseFrame *)AfxGetApp()->GetMainWnd():

3,socket 通讯也是,注意分段接收,可以做开始结束标识,当开始结束都包含在字符串内的时候,才代表接收完成。

4,数据库 sql server 2008r2操作
建议odbc源
sql语句
建表:

	select count(*) from sysobjects where id = OBJECT_ID('表名')     返回值>0则代表表已存在
	create table 表名 (id int IDENTITY(1,1) NOT NULL, constraint pkid primary key (id), 日期 varchar 

(50)))

插入:

insert into 表名 (列名,....) values (‘值’,......

删除:

delete from 表名 where 日期 >= '20200101' AND 日期 <= '20200721'

更新:

UPDATE 库名 set 表名 VALUES =1’ WHERE id = '1' 

5,list control 用线程读取数据库数据,防止UI卡住!控件分页显示 数据库报表

    CRect rect;   
    // 获取编程语言列表视图控件的位置和大小   
    m_programLangList.GetClientRect(&rect);   
    // 为列表视图控件添加全行选中和栅格风格   
    m_programLangList.SetExtendedStyle(m_programLangList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);   
    // 为列表视图控件添加三列   
    m_programLangList.InsertColumn(0, _T("语言"), LVCFMT_CENTER, rect.Width()/3, 0);   
    m_programLangList.InsertColumn(1, _T("2012.02排名"), LVCFMT_CENTER, rect.Width()/3, 1);   
    m_programLangList.InsertColumn(2, _T("2011.02排名"), LVCFMT_CENTER, rect.Width()/3, 2);   

// 在列表视图控件中插入列表项,并设置列表子项文本

   m_programLangList.InsertItem(0, _T("Java"));0行 第0 java列
    m_programLangList.SetItemText(0, 1, _T("1"));0行 第1

分页显示:
1.创造工程 testDlg,在对话框头文件中定义,四个公有变量

int pageNo; //页数编号
 int pageSize; // 每页显示条数
 int intStart; // 开始记录
 int intEnd; // 结束记录
 int max_page; // 记录最大页数

2.在构造函数中初始化

 pageSize=10;  
 pageNo=1; 

3.添加控件,并通过类向导添加响应函数,核心代码如下:

void CTestDlg::OnBtnFirst() // 第一页
{
    if (pageNo == 1)
   {
      AfxMessageBox(_T("已是第一页"));
   }
   else
  {
    pageNo = 1;
    m_ctlList.DeleteAllItems();
    ListShow();
  }
}
 
void CTestDlg::OnBtnPageup() // 上一页
{
    if(pageNo==1)
    {
        AfxMessageBox(_T("已是第一页"));
    }
    if(pageNo>1)
    {
        pageNo--;
        m_ctlList.DeleteAllItems();
        ListShow();
    }
}
 
void CTestDlg::OnBtnPagedown() // 下一页
{
   pageNo++; 
   if (pageNo > max_page)
   {   
        pageNo--;
        AfxMessageBox("已是最后一页");
        return;
   }
    m_ctlList.DeleteAllItems();
    ListShow();
}
 
void CTestDlg::OnBtnLast() // 最后一页
{
 if (pageNo == max_page)
 {
  AfxMessageBox("已是最后一页");
  return;
 }
 else
 {
  pageNo = max_page;
  m_ctlList.DeleteAllItems();
  ListShow();
 } 
}

4.在对话框初始化中设置List Control的风格
5.添加ListShow函数的实现,通过数据库实现

void ListShow()
{
	 intStart = pageSize * (pageNo-1);
	 intEnd = pageSize * pageNo;
	 for(int i = intStart,j=0;i<intEnd;i++,j++)
	    m_ctlList.InsertItem(j,str[i]);
	 for(int i = intStart,j=0;i<intEnd;i++,j++)
	    m_ctlList.InsertItem(j,1,str[i]);
	
	 CString strShowPage, strpageNo, strMaxPage;
	 strpageNo.Format("第 %d 页  ", pageNo);
	 strMaxPage.Format("共 %d 页", max_page);
	 strShowPage.Format(strpageNo + strMaxPage);
	 GetDlgItem(IDC_STATIC_SHOWPAGE)->SetWindowText(strShowPage);
 }

6,MonthCalendar 日历控件

void CMFC_Ctrl_TimeDlg::OnMcnSelchangeMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMSELCHANGE pSelChange = reinterpret_cast<LPNMSELCHANGE>(pNMHDR);

	SYSTEMTIME st = {0};
	m_calendar.GetCurSel(&st); //获取当前日期信息
	CString str;
	str.Format(L"%d年%d月%d日", st.wYear,st.wMongth,st.wDay);
	
	*pResult = 0;
}

你可能感兴趣的:(MFC,sql,windows,c++,算法,经验分享)