1. 程式人生 > >MFC獲取SqlServer資料庫所有表、欄位名、記錄資料

MFC獲取SqlServer資料庫所有表、欄位名、記錄資料

程式碼如下過程其實不是每一步都有,但是主要功能都在!

//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#