vc获取Access/ SqlServer 获取主键

int CDBManager::GetPrimaryKey(CString path, CString dbsource, DATEBASETYPE dbtype,CString ServerStr, CString TableName, vector<CString>& list)
{
	int ok = 1;

	_bstr_t   bstrConn;
	if(dbtype == ACCESS)
		bstrConn = "Provider='Microsoft.JET.OLEDB.4.0';Data source="+path;
	else if(dbtype == SQLSERVER)
	{
		CString strMdbConn;
		strMdbConn.Format("Provider='SQLOLEDB.1';Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=%s;Data Source=%s",
			dbsource, ServerStr);
		bstrConn = strMdbConn;
	}
	else
	{
		return 0;
	}
	_ConnectionPtr   pConnection=NULL; 
	_RecordsetPtr   pRstSchema=NULL; 
	SAFEARRAY   FAR*   psa   =   NULL; 
	SAFEARRAYBOUND   rgsabound; 
	_variant_t     var; 
	_variant_t     Array; 
	rgsabound.lLbound   =   0; 
	rgsabound.cElements   =   3; 
	psa   =   SafeArrayCreate(VT_VARIANT,   1,   &rgsabound); 
	var.vt   =   VT_EMPTY; 
	long   ix; 
	//PK_TABLE_CATALOG 
	ix   =   0; 
	SafeArrayPutElement(psa,   &ix,   &var); 
	//PK_TABLE_SCHEMA 
	ix=1; 
	SafeArrayPutElement(psa,   &ix,   &var); 
	//PK_TABLE_NAME 
	ix=2; 
	var.vt=VT_BSTR; 
	var.bstrVal=_bstr_t(TableName);//表名 
	SafeArrayPutElement(psa,   &ix,   &var); 
	Array.vt   =   VT_ARRAY|VT_VARIANT; 
	Array.parray   =   psa;  
	CString strMessage;
	CString   strMsg; 
	try 
	{ 
		pConnection.CreateInstance(__uuidof(Connection)); 
		pConnection->Open(bstrConn, "", "",adConnectUnspecified); 
		pRstSchema = pConnection->OpenSchema(adSchemaPrimaryKeys,&Array); 
		while(!pRstSchema->adoEOF)
		{
			FieldsPtr fields = pRstSchema->GetFields();

			_bstr_t   column_name=pRstSchema->GetFields()->GetItem("COLUMN_NAME")->Value; 
			_bstr_t   primarykey_name=pRstSchema->GetFields()->GetItem("PK_NAME")->Value; 
			list.push_back((LPCTSTR)column_name);
			strMsg.Format( "column_name:%s\nprimary key name:%s ",(LPCTSTR)column_name,(LPCTSTR)primarykey_name); 
			//AfxMessageBox(strMsg);
			pRstSchema->MoveNext();
		}
	} 
	catch   (_com_error   e) 
	{ 
		//AfxMessageBox(e.Description());
		CString* pStr = new CString((LPCSTR)e.Description());
		PostMessage(m_pDlg->GetSafeHwnd(), TIPINFO, (WPARAM)pStr,0);
		ok = 0;
		// PrintComError(e); 
	} 
	SafeArrayDestroy(psa);
	Array.vt = VT_EMPTY;//重要!可以试试去掉会怎么样
	if(pRstSchema != NULL && pRstSchema->State==adStateOpen) 
		pRstSchema->Close(); 
	if(pConnection != NULL && pConnection->State==adStateOpen) 
	{
		pConnection->Close();
	}
	return ok;
}

 
 
// 使用前需初始化com

猜你喜欢

转载自blog.csdn.net/nishuodeqianshou/article/details/50562274