MFC獲取SqlServer資料庫所有表、欄位名、記錄資料
阿新 • • 發佈:2018-12-16
程式碼如下過程其實不是每一步都有,但是主要功能都在!
//1、連線資料庫類 BOOL CSqlDlg::Ado(CString strConn) { ::CoInitialize(NULL); // 初始化OLE/COM庫環境 try { m_pConn.CreateInstance("ADODB.Connection"); //建立Connection物件 m_pConn->ConnectionTimeout=5; //設定超時時間為5秒 m_pConn->Open((_bstr_t)strConn,"", "", adModeUnknown);//連線資料庫 } catch(_com_error e) { CATCH_ERROR; return false; } return true; } //2、執行strSQL的SQL語句,返回集錄集 _RecordsetPtr& CSqlDlg::GetRS(CString strSQL) { try { m_pRS.CreateInstance(__uuidof(Recordset)); m_pRS->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);//執行SQL語句 } catch(_com_error e) { CATCH_ERROR } return m_pRS; } //3、獲取所有表名-SQL SERVER _RecordsetPtr pRS = GetRS("select name from sysobjects where xtype='U'"); CString user; int x=0; strArry.RemoveAll(); try { while (pRS->adoEOF==0) { strArry.Add((LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)x))); pRS->MoveNext(); } } catch(_com_error e) { CATCH_ERROR return; } //4、將表名寫入列表中 for(int i=0; i<strArry.GetSize(); i++) { m_list2.AddString(strArry.GetAt(i)); } //5、連線設定為不可用,斷開設定為可用 GetDlgItem(IDC_LIST)->EnableWindow(0); GetDlgItem(IDC_OPEN)->EnableWindow(1); //列表控制元件雙擊事件讀出表中記錄 //6、 m_list1.DeleteAllItems(); UpdateData(1); int q=0; //獲取記錄條數 q=GetNum(m_str_list); //獲取欄位個數====================================== CString strSql1; strSql1="select * from"; strSql1+=" "; strSql1+=m_str_list; _RecordsetPtr m_pRS2 = GetRS(strSql1); dataSize=GetFieldsCount(m_pRS2); //================================================== if (dataSize==0) { return; } //獲取欄位名strName================================== CString *strName=new CString[dataSize]; for (int bb=0;bb<dataSize;bb++) { GetFieldsName(m_pRS,bb,*(strName+bb)); } //==================================================== //清空表頭 while(m_list1.DeleteColumn(0)); //將欄位顯示出來 for (int cc=0;cc<dataSize;cc++) { m_list1.InsertColumn(cc, *(strName+cc), LVCFMT_LEFT, 150); } if (q==0) { return; } CString strSql; strSql="select * from"; strSql+=" "; strSql+=m_str_list; _RecordsetPtr pRS = GetRS(strSql); CStringArray *strdataArray=new CStringArray[dataSize]; //獲取欄位內容,並存入strdataArray+aa中============== try{ for (int aa=0;aa<dataSize;aa++) { while (pRS->adoEOF ==0) { CString str1; _variant_t varTemp; //str1.Format("%s",(LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)aa))); //判斷資料庫中的NULL值 varTemp=pRS->GetCollect(_variant_t((long)aa)); if(varTemp.vt ==VT_NULL) str1="<NULL>"; else str1.Format("%s",(LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)aa))); (strdataArray+aa)->Add(str1); pRS->MoveNext(); } pRS->MoveFirst(); } } catch(_com_error e) { CATCH_ERROR return; } //=================================================== CString str=""; CString str; for (int tt=0;tt<q;tt++) { m_list1.InsertItem(q,"1",0);//插入行 for(int i=0; i<dataSize; i++) { str =(strdataArray+i)->GetAt(tt); TRACE(" 行:%d, 列:%d,資料:%s\n",tt,i,str); m_list1.SetItemText(tt,i,str);//插入內容 // MessageBox(str); } } delete []strName; delete []strdataArray; //釋放申請的空間 } //得到記錄條數函式 int CSqlDlg::GetNum(CString strc) { int nSize=0; CString strSql; strSql="select count(*) from"; strSql+=" "; strSql+=strc; _RecordsetPtr pRS = GetRS(strSql); CString s=(LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)0)); char *ch=new char[s.GetLength()]; ch=(LPSTR)(LPCTSTR)s; nSize=atoi(ch); return nSize; delete []ch; } //獲取欄位名函式 BOOL CSqlDlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString & strFieldName) { if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count) return FALSE; _variant_t vt((long)nField); strFieldName.Format(_T("%s"), (char*)(RcdPtr->GetFields()->Item[vt]->Name)); return true; } //獲取欄位個數函式 int CSqlDlg::GetFieldsCount(_RecordsetPtr RcdPtr) { int nCount=0; if(NULL != RcdPtr) { nCount = RcdPtr->GetFields()->Count; } return nCount; } //斷開連線 void CSqlDlg::OnOpen() { // TODO: Add your control notification handler code here GetDlgItem(IDC_LIST)->EnableWindow(1); GetDlgItem(IDC_OPEN)->EnableWindow(0); //清空資料 m_list1.DeleteAllItems(); //清空list列表 while(m_list2.GetCount()) m_list2.DeleteString(0); //釋放ADO環境 m_pConn->Close(); m_pConn = NULL; ::CoUninitialize(); }
轉載自 : https://blog.csdn.net/xgx198831/article/details/6872303#