加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Access/ SqlServer 获取主键

发布时间:2020-12-12 13:08:38 所属栏目:MsSql教程 来源:网络整理
导读:#include afxdao.h#include icrsint.h#include basetsd.h#include ole2.hint CDBManager::GetPrimaryKey(CString path,CString dbsource,DATEBASETYPE dbtype,CString ServerStr,CString TableName,vectorCString list){_bstr_t bstrConn;if(dbtype == ACCES
#include <afxdao.h>
#include <icrsint.h>
#include <basetsd.h>
#include <ole2.h>
int CDBManager::GetPrimaryKey(CString path,CString dbsource,DATEBASETYPE dbtype,CString ServerStr,CString TableName,vector<CString>& list)
{
	_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='SQLNCLI.1';Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=%s;Data Source=%s",dbsource,ServerStr);
		bstrConn = strMdbConn;
	}
	else
	{
		return 0;
	}


	int ok = 1;
	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,&var); 
	//PK_TABLE_NAME 
	ix=2; 
	var.vt=VT_BSTR; 
	var.bstrVal=_bstr_t(TableName);//表名 
	SafeArrayPutElement(psa,&var); 
	Array.vt   =   VT_ARRAY|VT_VARIANT; 
	Array.parray   =   psa;  

	IADORecordBinding   *picRs = NULL;
	_RecordsetPtr pRstSchema("ADODB.Recordset");
	_ConnectionPtr pConnection("ADODB.Connection");
	pConnection->ConnectionString = bstrConn;
	if(dbtype==ACCESS)
		pConnection->Provider = "Microsoft.Jet.OLEDB.4.0";
	else if(dbtype == SQLSERVER)
		pConnection->Provider = "SQL Server";

	try
	{
		CString strMsg,strMessage;
		pConnection->Open(pConnection->ConnectionString,"",adModeUnknown);
		pRstSchema->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs);
		pRstSchema = pConnection->OpenSchema(adSchemaPrimaryKeys,&Array);
		
		int ncnt = pRstSchema->GetFields()->Count;
		for(int i = 0; i < ncnt; i++)
		{
			_bstr_t   value=pRstSchema->GetFields()->GetItem((long)i)->Name;
			strMessage.Format("%s,",(LPCTSTR)value);
			strMsg += strMessage;
		}

		while(!(pRstSchema->adoEOF))
		{
			CString strTableType;

			_bstr_t   column_name=pRstSchema->Fields->GetItem("COLUMN_NAME")->Value; 
			_bstr_t   primarykey_name=pRstSchema->Fields->GetItem("PK_NAME")->Value; 
			CString StrTableName(pRstSchema->Fields->GetItem("TABLE_NAME")->Value);
			if(StrTableName == TableName)
				list.push_back((LPCTSTR)column_name);
			//strMsg.Format( "column_name:%snprimary key name:%s ",(LPCTSTR)column_name,(LPCTSTR)primarykey_name); 

			pRstSchema->MoveNext();
		}
		SafeArrayDestroy(psa);
		// Clean up objects before exit.

		pRstSchema->Close();
		pConnection->Close();
	}
	catch (_com_error &e)
	{
		CString *ptr = new CString((LPCSTR)e.Description());
		PostMessage(m_pDlg->GetSafeHwnd(),TIPINFO,(WPARAM)ptr,0);
		ok = 0;
	}

	return ok;
}
// 使用前需初始化com

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读