c语言可以连接access数据库??

c语言可以连接access数据库??,第1张

#import "C:\program files\common files\system\ado\msado15.dll " no_namespace rename( "EOF ", "adoEOF ")

//#import "c:\program files\common files\system\ado\msado15.dll " rename ( "EOF ", "adoEOF ") no_namespace

#define CREATEiNSTANCE(sp,riid) { HRESULT _hr =sp .CreateInstance( __uuidof( riid ) ) \

if (FAILED(_hr)) _com_issue_error(_hr) }

#define RsITEM(rs,x) ((rs->Fields->Item[_variant_t(x)]->Value))

class CHmbAdoDB

{

public:

BOOL m_bOpen

_ConnectionPtr m_DbConn

CString m_ErrMsg

CString m_SQLState

long mSqlCode

public:

void Cancel()

BOOL IsOpen()

void RollbackTrans()

void CommitTrans()

long BeginTrans()

void Close()

BOOL Open(LPCSTR lpszConnect)

BOOL Execute(LPCTSTR lpSQL)

void ProviderError()

CHmbAdoDB()

{

}

virtual ~CHmbAdoDB()

{

}

}

class CHmbAdoDBRs : public CObject

{

public:

_RecordsetPtr m_Rs

public:

CHmbAdoDBRs()

virtual ~CHmbAdoDBRs()

BOOL Open( CHmbAdoDB *pDB, LPCSTR szSource,long option=-1)

void Close()

void GetRs(_variant_t x,_bstr_t &ret)

void GetRs(_variant_t x,CString &ret)

BOOL IsEOF()

BOOL IsOpen()

BOOL MoveNext()

BOOL MovePrev()

BOOL MoveFirst()

BOOL MoveLast()

}

#endif // !defined(AFX_RfidAdoDB_H__7C539954_1C62_47B6_AB6E_1A5BB73A67E5__INCLUDED_) truct InitOle

{

InitOle() { ::CoInitialize(NULL) }

~InitOle() { ::CoUninitialize() }

} _init_InitOle_

long mSqlCode

BOOL CHmbAdoDB::Open(LPCSTR lpszConnect)

{

try

{

CREATEiNSTANCE(m_DbConn,Connection)

m_DbConn->Open(lpszConnect, " ", " ", adModeUnknown )

}

catch( _com_error &e)

{

return FALSE

}

catch(...)

{

return FALSE

}

return TRUE

}

void CHmbAdoDB::Close()

{

if( IsOpen() )

{

m_DbConn->Close()

}

}

long CHmbAdoDB::BeginTrans()

{

return m_DbConn->BeginTrans()

}

void CHmbAdoDB::CommitTrans()

{

m_DbConn->CommitTrans()

}

void CHmbAdoDB::RollbackTrans()

{

m_DbConn->RollbackTrans()

}

void CHmbAdoDB::Cancel()

{

m_DbConn->Cancel()

}

BOOL CHmbAdoDB::IsOpen()

{

return ( (m_DbConn->GetState() != 0) ? TRUE : FALSE )

}

BOOL CHmbAdoDB::Execute(LPCTSTR lpSQL)

{

if (!IsOpen())

{

AfxMessageBox( "Network error, Database do not open. ")

return FALSE

}

CString strSQL(lpSQL)

strSQL.TrimLeft()

strSQL.TrimRight()

try

{

m_DbConn->Execute(_bstr_t(strSQL), NULL, adExecuteNoRecords)

}

catch( _com_error &e)

{

return FALSE

}

catch(...)

{

return FALSE

}

return TRUE

}

void CHmbAdoDB::ProviderError()

{

// Print Provider Errors from Connection object.

// pErr is a record object in the Connection 's Error collection.

ErrorPtr pErr = NULL

if( (m_DbConn->Errors->Count) > 0)

{

long nCount = m_DbConn->Errors->Count

// Collection ranges from 0 to nCount -1.

for(long i = 0 i < nCount i++)

{

pErr = m_DbConn->Errors->GetItem(i)

mSqlCode = pErr->NativeError

m_ErrMsg.Format( "SQLCODE : %ld\t%s ",mSqlCode, LPCTSTR(pErr->Description))

m_SQLState.Format( "%s ",(char*)pErr->SQLState)

printf( "%s // %s\n ",m_SQLState,m_ErrMsg)

}

}

m_DbConn->Errors->Clear()

}

CHmbAdoDBRs::CHmbAdoDBRs( )

{

}

CHmbAdoDBRs::~CHmbAdoDBRs()

{

}

BOOL CHmbAdoDBRs::Open( CHmbAdoDB *pDB, LPCSTR szSource,long option )

{

CString strSQL

strSQL = CString(szSource)

strSQL.TrimLeft()

strSQL.TrimRight()

_variant_t vRecsAffected(0L)

// CREATEiNSTANCE( m_Rs,Recordset)

// m_Rs->PutRefActiveConnection( pDB->m_DbConn )

try

{

m_Rs = pDB->m_DbConn->Execute(_bstr_t(strSQL),

&vRecsAffected,

adOptionUnspecified)

m_Rs->AddRef()

// m_Rs->Open(szSource, vtMissing, adOpenKeyset, adLockBatchOptimistic, adOptionUnspecified)

// m_Rs->Open(szSource, vtMissing, adOpenKeyset, adLockReadOnly, option)

// m_Rs->Open(szSource,pDB->m_DbConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic, adCmdText)

}

catch( _com_error &e)

{

//ErrorMessage()

m_Rs->Close()

m_Rs->Release()

return FALSE

}

catch(...)

{

m_Rs->Close()

m_Rs->Release()

return FALSE

}

return TRUE

}

void CHmbAdoDBRs::Close()

{

m_Rs->Close()

m_Rs->Release()

}

void CHmbAdoDBRs::GetRs(_variant_t x,_bstr_t &ret)

{

ret = (m_Rs->Fields->Item[x]->Value)

}

void CHmbAdoDBRs::GetRs(_variant_t x,CString &ret)

{

_bstr_t retVal

try{

retVal = (m_Rs->Fields->Item[x]->Value)

}

catch(...){

ret = " "

return

}

ret = CString((char*) retVal)

}

BOOL CHmbAdoDBRs::IsEOF()

{

return m_Rs->adoEOF

}

BOOL CHmbAdoDBRs::IsOpen()

{

return ( (m_Rs->GetState() != 0) ? TRUE : FALSE )

}

BOOL CHmbAdoDBRs::MoveNext() { return (FAILED(m_Rs->MoveNext()) ? FALSE : TRUE ) }

BOOL CHmbAdoDBRs::MovePrev() { return (FAILED(m_Rs->MovePrevious()) ? FALSE : TRUE ) }

BOOL CHmbAdoDBRs::MoveFirst() { return (FAILED(m_Rs->MoveFirst()) ? FALSE : TRUE ) }

BOOL CHmbAdoDBRs::MoveLast() { return (FAILED(m_Rs->MoveLast()) ? FALSE : TRUE ) }

以上为一个ADO的封装类.

c语言如何连接access数据库

现在一般是用ADO的方法.

1、C/C++与数据库交互,像 mssql/ mysql / oracle 等,一般都有成熟的第三方库,这些库里面无非就是封装了与数据库通讯的方式和通讯协议搜一下要用的数据库相关的 API 文档,会说得很清楚任何文件都是二进制数据,关键是数据存储的组织方式通用扩展名的文件,像gif/doc/jpg/wav,格式都是固定的。

2、举个例子,连接SQL:

// 打开数据库

strDBClass.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0Data Source=%sJet OLEDB:Database Password=%s"), m_strUnEntryptMdbFilePath,m_strMDBPassword)

// 创建连接

HRESULT hr = m_pConnection.CreateInstance(_uuidof(Connection))

_ConnectionPtr m_pConnection->Open(m_strDBClass,_T(""),_T(""),adConnectUnspecified)

// 声明表单指针

_RecordsetPtr pBandRecordset

pBandRecordset.CreateInstance(__uuidof(Recordset))

// 执行语句

CString strSQL(L"SELECT * FROM [Band]")

m_pConnection->Execute((LPCTSTR)strSQL,NULL,0)

// 提取某一项 例如BandInfo

int iBandInfo = wcscmp(colum, L"BandInfo")

while(!recordsetPtr->adoEOF)

{

var = recordsetPtr->GetCollect(colum)

if(var.vt != VT_NULL)

strName = (LPCSTR)_bstr_t(var)

recordsetPtr->MoveNext()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9902142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存