一.MFC中ADO链接数据库通常有四个步骤
(1)引入ADO文件
(2)初始化OLE/COM库文件
(3)利用Connection对象连接数据
(4)利用建立好的链接,通过Connection,Command对象执行SQL命令,或者利用Recordset对象取得结果进行查询和处理
1.引入ADO文件
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
为了避免冲突将常数EOF改名为adoEOF 并且上述预编译指令不能放在stdAfx.h文件的开头 应该放在所有include的后面
2.初始化OLE/COM库环境::CoInitialize(NULL) 在使用完后要用::CoUninitialize()释放
也可以用AfxOleInit()函数初始化 但是在使用完成后对于m_pRecordset不需要释放 系统会自动释放 不然的话会崩溃哦(亲身经历)
搞了好长时间都找不到原因 偶尔在网上看到才得以解决 只想说小细节但问题
3.利用Connection对象连接数据(对SQL server 链接数据库的几种不同的方式)
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(_uuidof(Connection));
try
(1)CString strSQL="Provider=SQLOLEDB;
Integrated Security=SSPI;
Persist Security Info=False;
Initial Catalog=student;
Data Source=.";
m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown);
(2)CString strSQL="Provider=SQLOLEDB;//和上述方法相同 只是去掉了几个参数而已 这里对于参数不明白 望各路大神指教
Integrated Security=SSPI;
Persist Security Info=False;
Initial Catalog=student;
Data Source=.";
m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown);
(3)m_pConnection->Open("driver={SQL Server};Server=172.16.49.44;DATABASE=student;UID=sa;PWD=123",
"",
"",
adModeUnknown);
catch(_com_error e)
{
AfxMessageBox("失败连接数据库!");
return 0;
}
4.利用Recordset打开记录集并取得数据
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance (_uuidof(Recordset));
try
{
m_pRecordset->Open(
_variant_t("select * from stu"),
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
_variant_t var;
CString str;
for(int i=0; !m_pRecordset->adoEOF; i++)
{
var = m_pRecordset->GetCollect("name");
str = (LPCSTR)_bstr_t(var);
m_listStuInfo.InsertItem(i,str);
var = m_pRecordset->GetCollect("age");
str = (LPCSTR)_bstr_t(var);
m_listStuInfo.SetItemText(i,1,str);
var = m_pRecordset->GetCollect("sex");
str = (LPCSTR)_bstr_t(var);
m_listStuInfo.SetItemText(i,2,str);
m_pRecordset->MoveNext();
}
m_pRecordset->AddNew();
m_pRecordset->PutCollect("StudentID",_variant_t(m_strNum));
(1)引入ADO文件
(2)初始化OLE/COM库文件
(3)利用Connection对象连接数据
(4)利用建立好的链接,通过Connection,Command对象执行SQL命令,或者利用Recordset对象取得结果进行查询和处理
1.引入ADO文件
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
为了避免冲突将常数EOF改名为adoEOF 并且上述预编译指令不能放在stdAfx.h文件的开头 应该放在所有include的后面
2.初始化OLE/COM库环境::CoInitialize(NULL) 在使用完后要用::CoUninitialize()释放
也可以用AfxOleInit()函数初始化 但是在使用完成后对于m_pRecordset不需要释放 系统会自动释放 不然的话会崩溃哦(亲身经历)
搞了好长时间都找不到原因 偶尔在网上看到才得以解决 只想说小细节但问题
3.利用Connection对象连接数据(对SQL server 链接数据库的几种不同的方式)
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(_uuidof(Connection));
try
(1)CString strSQL="Provider=SQLOLEDB;
Integrated Security=SSPI;
Persist Security Info=False;
Initial Catalog=student;
Data Source=.";
m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown);
(2)CString strSQL="Provider=SQLOLEDB;//和上述方法相同 只是去掉了几个参数而已 这里对于参数不明白 望各路大神指教
Integrated Security=SSPI;
Persist Security Info=False;
Initial Catalog=student;
Data Source=.";
m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown);
(3)m_pConnection->Open("driver={SQL Server};Server=172.16.49.44;DATABASE=student;UID=sa;PWD=123",
"",
"",
adModeUnknown);
catch(_com_error e)
{
AfxMessageBox("失败连接数据库!");
return 0;
}
4.利用Recordset打开记录集并取得数据
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance (_uuidof(Recordset));
try
{
m_pRecordset->Open(
_variant_t("select * from stu"),
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
_variant_t var;
CString str;
for(int i=0; !m_pRecordset->adoEOF; i++)
{
var = m_pRecordset->GetCollect("name");
str = (LPCSTR)_bstr_t(var);
m_listStuInfo.InsertItem(i,str);
var = m_pRecordset->GetCollect("age");
str = (LPCSTR)_bstr_t(var);
m_listStuInfo.SetItemText(i,1,str);
var = m_pRecordset->GetCollect("sex");
str = (LPCSTR)_bstr_t(var);
m_listStuInfo.SetItemText(i,2,str);
m_pRecordset->MoveNext();
}
m_pRecordset->AddNew();
m_pRecordset->PutCollect("StudentID",_variant_t(m_strNum));