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