分类: C/C++
2008-08-04 09:30:32
char path[MAX_PATH] = {''\0''}; GetModuleFileName(NULL,path,MAX_PATH);//得到执行文件名 m_strExePath.Format("%s", path); int iPosition; iPosition = m_strExePath.ReverseFind(''\\''); m_strExePath = m_strExePath.Left(iPosition 1); CString strAccessPath = m_strExePath "test.mdb";//得到这个数据库文件的路径 int iLen = strAccessPath.GetLength(); char cpConfig[MAX_PATH]; //由于在这个联结串中有靠\0来分开数据源每个配置信息项的,所以只好用下面的笨方法了。 strcpy(cpConfig, "DSN=daliu\0"); strcpy(cpConfig 10, "DBQ="); strcpy(cpConfig 14, strAccessPath); strcpy(cpConfig 14 iLen, "\0"); strcpy(cpConfig 15 iLen, "DEFAULTDIR="); strcpy(cpConfig 15 iLen 11, m_strExePath); strcpy(cpConfig 25 iLen m_strExePath.GetLength(), "\0\0"); if(!SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN, "Microsoft Access Driver (*.mdb)\0",cpConfig))//设置odbc数据源步骤四:
ImageList.Create(16,16,ILC_COLOR8,0,5); ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); DWORD dwStyle=GetWindowLong(m_list.GetSafeHwnd(),GWL_STYLE); dwStyle |= LVS_REPORT; SetWindowLongA(m_list.GetSafeHwnd(),GWL_STYLE,dwStyle); m_list.SetExtendedStyle(LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_TRACKSELECT); m_list.SetImageList(&ImageList, LVSIL_SMALL); ShowData()//这个函数是用来向列表框中插入数据的。下面我们来分析一下ShowData()函数,它是使用CMYODBC的关键。
BOOL CDemo1Dlg::ShowData() { int i = 0, iCount; m_list.DeleteAllItems();//首先清空listview iCount = m_list.GetHeaderCtrl()->GetItemCount(); for(i = 0; i < iCount; i ) { m_list.DeleteColumn(0); } for(i = 0; i < iCount; i ) { m_list.GetHeaderCtrl()->DeleteItem(0); } /*上面的代码用于清空ClistCtrl控件中项,上面的两个循环并不能合成一个,你可以试一下*/ CString strSql; strSql = "select * from emp";//sql查询语句 CMyODBC db; //声明CMyODBC类的实例 CODBCSet set;//声明CODBCSet类的实例 /*联接数据库,由于access数据库没有设定用户和口//令,所以它们两个就用空的字符串代替*/ db.ConnectDB("daliu","", ""); /*准备sql语句,你可以跟踪一下,在这个函数中完成动态的绑定,得到共有几列,每列的名称等*/ db.PrepareSql(strSql, set); for(i = 0; i < set.GetCols(); i )/*set.GetCols()得到本次查询得到了几列。*/ { m_list.InsertColumn(i, set.m_coldatafmt[i].name,LVCFMT_CENTER,80); } /*上面的循环用于插入列, m_coldatafmt是一个COL_DATAFMT_ODBC的结构, 在我们调用db.PrepareSql()后,它就含有了每个列的名称,字段数据类型,字段数据长度信息。*/ /*下面的循环用于向列表框中插入数据, set.m_coldata是一个COL_DATA_ODBC的结构, 当含有当前行的数据值,数据值的长度信息,这样就实现了从记录集中取数据的功能。*/ int iRow = 0; while(db.FetchData())/*每次取回一条记录。*/ { for(i = 0; i < set.GetCols(); i ) { if(i == 0) { m_list.InsertItem(iRow, set.m_coldata[0].value); } else { m_list.SetItemText(iRow, i, set.m_coldata[i].value); } } iRow ; } set.Empty();/*清空记录集*/ db.DisConnect();/*断开连接*/ return TRUE; }下面我们再来看一个如何插入一条记录:
void CDemo1Dlg::OnBtnadd() { UpdateData(TRUE); CString strSql; strSql.Format("insert into emp values(%d,''%s'',''%s'')", atoi(m_strID), m_strName, m_strJob); CMyODBC db; db.ConnectDB("daliu","", "");//连接数据库 db.ExeSqlDirect(strSql);//执行sql语句 db.DisConnect();//断开连接 this->ShowData();//刷新数据 }响应其它的按钮的函数就不一一写了,和上面的都差不多,希望通过它能给我们用VC的开发数据库工程带来一些方便。