日期:2014-05-18  浏览次数:20518 次

在mfc中如何调用数据库!!!
哪位大狭能详细的说说
如何在mfc中调用server 2000啊
小弟万分感谢!!!

------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/6hs301kk(VS.80).aspx
------解决方案--------------------
小弟自行研究了两天,研究出两种方法连数据库,但是各有优势。需要自己去体会,MFC连数据库还是比较麻烦的一个操作。

先就在这里介绍一种吧,通过ADO连接数据库。下面是我自己写的一个类中的一部分。希望能给你帮助!


CAdodb.h
#import "C:\program files\common files\System\ado\msado15.dll" no_namespace \
rename("EOF","EndOfFile") \
rename("LockTypeEnum","newLockTypeEnum") \
rename("DataTypeEnum","newDataTypeEnum") \
rename("FieldAttributeEnum","newFieldAttributeEnum") \
rename("EditModeEnum","newEditModeEnum") \
rename("RecordStatusEnum","newRecordStatusEnum") \
rename("ParameterDirectionEnum","newParameterDirectionEnum")


CAdodb.cpp
//初始化
CAdodb::CAdodb(void)
{
HRESULT hr = S_OK; // 默认返回值
if FAILED(CoInitialize(NULL)) // COM 初始化调用
{
CoUninitialize();
hr = E_UNEXPECTED;
}
}

CAdodb::~CAdodb(void)
{
}

//打开连接
_ConnectionPtr CAdodb::InitSQLServer(CString server, CString db, CString UserName, CString Pwd)
{
m_pConnection.CreateInstance("ADODB.Connection");
CString strCn;
strCn.Empty();
strCn="provider=SQLOLEDB;data source="+server+";initial catalog="+db+";userID="+UserName+";Password="+Pwd;
_variant_t bcnstr=_variant_t(strCn);
_variant_t bunstr=_variant_t(UserName);
_variant_t bpwdstr=_variant_t(Pwd);
//打开一个连接
try
{
HRESULT hr = m_pConnection->Open(_bstr_t(bcnstr),_bstr_t(bunstr),
_bstr_t(bpwdstr),-1);//adOpenUnspecified
return m_pConnection;
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format(_T("Warning: 连接数据库发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
AfxMessageBox(errormessage);
return NULL;
}
catch(...)
{
AfxMessageBox(_T("Warning :连接数据库时发生未知错误"));
return NULL;
}
}
//得到记录
_RecordsetPtr CAdodb::GetRecordSet( LPTSTR strSql, _ConnectionPtr ptrConn )
{
try
{
_RecordsetPtr ptrRS = NULL; // recordset 对象
ptrRS.CreateInstance( __uuidof(Recordset) );// 创建recordset 对象实体
ptrRS = ptrConn ->Execute(strSql,NULL, adCmdText);
return ptrRS;
}
catch( _com_error & a_pComError )

{
//… 错误处理
AfxMessageBox(_T("错误"));
return NULL;
}


//得到里面的值
_RecordsetPtr rs = ds;
if (rs->BOF)
{
AfxMessageBox(_T("没有记录"));
return E_UNEXPECTED;
}
else
{
long lNoOfColumns;
lNoOfColumns = rs->Fields->Count;
_variant_t l_vaIndex;
l_vaIndex.vt = VT_I2;
do 
{
for( long lIndex = 0; lIndex <lNoOfColumns; lIndex++ )
{
l_vaIndex.iVal = lIndex;
CString Value = rs->Fields->GetItem(l_vaIndex)->Value;
}
rs->MoveNext();
}while (!rs->EndOfFile);
}


自己从中再去体会吧,如还想知道第二种,以及其他什么问题再联系。
------解决方案--------------------
方法如下:使用odbc方式
第一步:在mfc中定义一个Cdatebase对象,CDatebase m_db
然后使用m_db打开数据库,m_db.open(odbc驱动)
然后建立一个记录集 CRecordset rs(&m_db)
使用rs打开一个记录集
rs.Open(CRecordset::forwardOnly,"SQL语句");
while(!rs.IsEOF())
{
rs.GetFieldValue("要取得数据的字段",str);

i++;
rs.MoveNext();
}
rs.Close();