第一次接触数据库 求MFC连接数据库的详细方法我数据库用的是SQL Server 2008别怕罗嗦,只怕不够详细 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include <afxdb.h>void CDlg::OnStnClickedButton1(){ CDatabase conn; conn.OpenEx(L"Driver={SQL Server};server=192.168.0.101;uid=sa;pwd=123456;database=db1",CDatabase::openReadOnly|CDatabase::noOdbcDialog); CRecordset rs(&conn); rs.Open(CRecordset::forwardOnly,L"select * from table",CRecordset::readOnly); while(!rs.IsEOF()){ CString sFieldValue; rs.GetFieldValue(L"sFieldName",sFieldValue); MessageBox(sFieldValue); rs.MoveNext(); }} 建议学习ADO的方式连接数据库,具体的网上有一大堆资料 ++,这是ODBC的连接方法,还可以用ODBC API或者ADO等方法去连接 http://hi.baidu.com/hezhe1008/blog/item/c798ad145486d212962b43c9.html里边有几篇ADO的文章 bool CMyDataBase::DeleteUserOfSelected(CString UserID){ CString strSql; _variant_t RecordsAffected; strSql.Format("DELETE FROM users WHERE UserID = %d",atoi(UserID)); // strSql="DELETE FROM users WHERE UserID = 10"; //AfxMessageBox(strSql); m_pConnection->Execute((_bstr_t)strSql,&RecordsAffected,adCmdText); AfxMessageBox(strSql); return TRUE;}void CMyDataBase::SaveNewUserToDataBase(){ //实际此函数应采用一个结构体传入参数// InitDataBase();//这是必须的 CString strSql; _variant_t RecordsAffected; CString m_1,m_2,m_3; m_1="林妹妹"; m_2="13579"; m_3="小林"; strSql.Format("INSERT INTO users(UserName,LoginPassWord,DisplayName) VALUES ('%s','%s','%s')",m_1,m_2,m_3); m_pConnection->Execute((_bstr_t)strSql,&RecordsAffected,adCmdText); }bool CMyDataBase::InitDataBase(){ //初始化数据库连接 HRESULT hr; try { hr = m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象 if(SUCCEEDED(hr)) { hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase.mdb","","",adModeUnknown);///连接数据库 //hr = m_pConnection->Open("studb","","",adModeUnknown); } } catch(_com_error e)///捕捉异常 { CString errormessage; errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage()); AfxMessageBox(errormessage);///显示错误信息 } _variant_t RecordsAffected; //m_pConnection->Execute("CREATE TABLE studentinfo(stuNo TEXT,stuname TEXT,stuaddress TEXT,stuphone TEXT)",&RecordsAffected,adCmdText); // CString strSQL;// CString s1,s2;// strSQL.Format("INSERT INTO users(UserName,PassWord) VALUES ('%s','%s')","abc","123456");// strSQL.Format("INSERT INTO users(UserName,LoginPassWord,DisplayName) VALUES ('%s','%s','%s')","东方不败","123456","东方妹妹");// m_pConnection->Execute((_bstr_t)strSQL,&RecordsAffected,adCmdText); return TRUE;} //把会议室列表的初始化打包到这儿void CMyDataBase::InitConfListCtrl(CListCtrl* pListCtrl){ /*直接插入行测试指针 pListCtrl->InsertItem(0, 0);//插入行 pListCtrl->SetItemText(0, 1, "公共聊天室");//设置数据 pListCtrl->SetItemText(0, 2, "50"); pListCtrl->SetItemText(0, 3, "5"); pListCtrl->SetItemText(0, 4, "2010-12-1"); pListCtrl->SetItemText(0, 5, "2010-12-1"); */ InitDataBase();//这是必须的 //设置风格 LONG lStyle; lStyle = GetWindowLong(pListCtrl->m_hWnd, GWL_STYLE);//获取当前窗口style lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置style SetWindowLong(pListCtrl->m_hWnd, GWL_STYLE, lStyle);//设置style DWORD dwStyle = pListCtrl->GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl) //dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件 pListCtrl->SetExtendedStyle(dwStyle); //设置扩展风格 pListCtrl->InsertColumn( 0, "ID", LVCFMT_LEFT, 0 );//插入列,将宽度设置成0,在外观上就看不到此列,用来存放会员号 pListCtrl->InsertColumn( 1, "ID", LVCFMT_LEFT, 60 ); pListCtrl->InsertColumn( 2, "会议室名称", LVCFMT_LEFT, 100 ); pListCtrl->InsertColumn( 3, "容量", LVCFMT_LEFT, 60 ); pListCtrl->InsertColumn( 4, "在线", LVCFMT_LEFT, 60 ); pListCtrl->InsertColumn( 5, "开始", LVCFMT_LEFT, 140 ); pListCtrl->InsertColumn( 6, "结束", LVCFMT_LEFT, 140 ); HRESULT hr; _RecordsetPtr pRentRecordset; hr=pRentRecordset.CreateInstance(__uuidof(Recordset)); if(FAILED(hr)) { AfxMessageBox("createinstance of Recordset failed!\n can`t initiate List control!"); return; } CString strSql; _variant_t var; CString strValue; int curItem=0; strSql="SELECT * FROM Conf"; try { hr=pRentRecordset->Open(_variant_t(strSql), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); if(SUCCEEDED(hr)) { while(!pRentRecordset->adoEOF) { var = pRentRecordset->GetCollect((long)0); if(var.vt != VT_NULL) strValue = (LPCSTR)_bstr_t(var); pListCtrl->InsertItem(curItem,strValue); var = pRentRecordset->GetCollect("ConfID"); if(var.vt != VT_NULL) strValue = (LPCSTR)_bstr_t(var); pListCtrl->SetItemText(curItem,1,strValue); var = pRentRecordset->GetCollect("ConfName"); if(var.vt != VT_NULL) strValue = (LPCSTR)_bstr_t(var); pListCtrl->SetItemText(curItem,2,strValue); var = pRentRecordset->GetCollect("MaxNum"); if(var.vt != VT_NULL) strValue = (LPCSTR)_bstr_t(var); pListCtrl->SetItemText(curItem,3,strValue); var = pRentRecordset->GetCollect("OnlineNum"); if(var.vt != VT_NULL) strValue = (LPCSTR)_bstr_t(var); pListCtrl->SetItemText(curItem,4,strValue); var = pRentRecordset->GetCollect("StartTime"); if(var.vt != VT_NULL) strValue = (LPCSTR)_bstr_t(var); pListCtrl->SetItemText(curItem,5,strValue); var = pRentRecordset->GetCollect("EndTime"); if(var.vt != VT_NULL) strValue = (LPCSTR)_bstr_t(var); pListCtrl->SetItemText(curItem,6,strValue); pRentRecordset->MoveNext(); curItem++; } } else { AfxMessageBox("Open recordset fail!"); } } catch(_com_error *e) { AfxMessageBox(e->ErrorMessage()); return; } pRentRecordset->Close(); pRentRecordset=NULL;} 关键几个步骤.(用ADO链接)1\添加msado15.dll.在stdafx.h中添加如下如句#import"C:\Program Files\Common Files\System\ado\msado15.dll"\ no_namespace\ rename("EOF","adoEOF")2\初始化COM如果是使用dialog创建的工程需要添加如下语句,如果是SDI中的formView的话,则不需要,架构自动添加了在CSqlConnect06App::InitInstance()中添加如如下语句:if (!SUCCEEDED(CoInitialize(NULL))) { ::AfxMessageBox(_T("初始化COM失败!")); return FALSE; }一定要在对话框创建语句之前添加.CSqlConnect06Dlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal();就是这几句之前.3\建立链接在dlg类中添加成员变量 _ConnectionPtr m_pConnection; _CommandPtr m_pCommand; _RecordsetPtr m_pRecordset;在dlg类中添加两个函数 OpenDatabase和CloseDatabaseBOOL CSqlConnect06Dlg::OpenDatabase(LPCTSTR lpszConnect, long nOptions){ ASSERT(m_pConnection!=NULL); ASSERT(lpszConnect!=NULL); ASSERT(AfxIsValidString(lpszConnect)); try { return SUCCEEDED(m_pConnection->Open(_bstr_t(lpszConnect),_T("sa"),_T(""),nOptions)); } catch(_com_error& e) { TRACE(_T("%s\n"),e.ErrorMessage()); return FALSE; }}BOOL CSqlConnect06Dlg::CloseDatabase(void){ ASSERT(m_pConnection!=NULL); try { if (m_pConnection->State& adStateOpen) { return SUCCEEDED(m_pConnection->Close()); } else { return TRUE; } } catch(_com_error& e) { TRACE(_T("%s\n"),e.ErrorMessage()); return FALSE; } //return 0;}在dlg类的构造函数中添加如下初始化语句if (!SUCCEEDED(m_pConnection.CreateInstance(__uuidof(Connection)))) { m_pConnection=NULL; TRACE(_T("Database CreateInSTance Failed!")); } if (!SUCCEEDED(m_pRecordset.CreateInstance(__uuidof(Recordset)))) { m_pRecordset=NULL; TRACE(_T("Recordset CreateInstance Failed!")); } if (!SUCCEEDED(m_pCommand.CreateInstance(__uuidof(Command)))) { m_pCommand=NULL; TRACE(_T("Command CreateInstance Failed!")); } CString strConnect=_T("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=DB_jiecai;Data Source=ADW"); if (!OpenDatabase(strConnect,adModeUnknown)) { AfxMessageBox(_T("数据库打开失败")); return; } m_pCommand->ActiveConnection=m_pConnection;}在析构函中添加CSqlConnect06Dlg::~CSqlConnect06Dlg(){ m_pConnection->Close();}在这时介绍一个获取链接语句的好方法:CString strConnect=_T("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=DB_jiecai;Data Source=ADW");新建一个txt文件,将其后缀改为udl双击打开它.在第一个选项卡(提供程序)中选择Microsoft OLE DB provider for SQL Server.在第二个选项卡选择服务器名称,输入链接的用户名称和密码,选择你要链接的数据库,点测试连接.成功后点确定.将文件重新命名为txt文件,打开,文件中的最后一句就是连接语句了.本人也正在学习数据库方面的编程,在这里权当复习了. http://www.pudn.com/downloads385/sourcecode/windows/database/detail1655327.html这里有个ADO的实例 http://www.codeproject.com/KB/database/connectionstrings.aspx waitforsingleobject不起作用?? ATL调用strcasecmp出错 如何定义线程函数指针 很简单的LINUX问题,共120分,谢谢! 我们单位有一台基于上级单位EXCHANGE邮件收发服务器的客户端,用OUTLOOK来收发企业间的电子邮件,现在想使局域网内的另一台计算机也可以利 谁有MapInfo的.mif文件格式的说明文件,我不认识E文 怎样把CString转华成int型 B样条曲线的算法 vb & 3D 请问怎么通过VC+sql+ADO进行数据加密? 如何VC++实现监控过程中图片的自动定 请教大家,关于CListBox嵌入自绘滚动条的问题..
#include <afxdb.h>
void CDlg::OnStnClickedButton1()
{
CDatabase conn;
conn.OpenEx(L"Driver={SQL Server};server=192.168.0.101;uid=sa;pwd=123456;database=db1",CDatabase::openReadOnly|CDatabase::noOdbcDialog);
CRecordset rs(&conn);
rs.Open(CRecordset::forwardOnly,L"select * from table",CRecordset::readOnly);
while(!rs.IsEOF()){
CString sFieldValue;
rs.GetFieldValue(L"sFieldName",sFieldValue);
MessageBox(sFieldValue);
rs.MoveNext();
}
}
++,这是ODBC的连接方法,还可以用ODBC API或者ADO等方法去连接
里边有几篇ADO的文章
bool CMyDataBase::DeleteUserOfSelected(CString UserID)
{
CString strSql;
_variant_t RecordsAffected; strSql.Format("DELETE FROM users WHERE UserID = %d",atoi(UserID)); // strSql="DELETE FROM users WHERE UserID = 10";
//AfxMessageBox(strSql);
m_pConnection->Execute((_bstr_t)strSql,&RecordsAffected,adCmdText);
AfxMessageBox(strSql);
return TRUE;
}void CMyDataBase::SaveNewUserToDataBase()
{
//实际此函数应采用一个结构体传入参数// InitDataBase();//这是必须的 CString strSql; _variant_t RecordsAffected;
CString m_1,m_2,m_3;
m_1="林妹妹";
m_2="13579";
m_3="小林"; strSql.Format("INSERT INTO users(UserName,LoginPassWord,DisplayName) VALUES ('%s','%s','%s')",m_1,m_2,m_3);
m_pConnection->Execute((_bstr_t)strSql,&RecordsAffected,adCmdText); }bool CMyDataBase::InitDataBase()
{
//初始化数据库连接
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase.mdb","","",adModeUnknown);///连接数据库
//hr = m_pConnection->Open("studb","","",adModeUnknown);
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
_variant_t RecordsAffected;
//m_pConnection->Execute("CREATE TABLE studentinfo(stuNo TEXT,stuname TEXT,stuaddress TEXT,stuphone TEXT)",&RecordsAffected,adCmdText);
// CString strSQL;// CString s1,s2;// strSQL.Format("INSERT INTO users(UserName,PassWord) VALUES ('%s','%s')","abc","123456");
// strSQL.Format("INSERT INTO users(UserName,LoginPassWord,DisplayName) VALUES ('%s','%s','%s')","东方不败","123456","东方妹妹");// m_pConnection->Execute((_bstr_t)strSQL,&RecordsAffected,adCmdText);
return TRUE;
} //把会议室列表的初始化打包到这儿
void CMyDataBase::InitConfListCtrl(CListCtrl* pListCtrl)
{ /*直接插入行测试指针
pListCtrl->InsertItem(0, 0);//插入行
pListCtrl->SetItemText(0, 1, "公共聊天室");//设置数据
pListCtrl->SetItemText(0, 2, "50");
pListCtrl->SetItemText(0, 3, "5");
pListCtrl->SetItemText(0, 4, "2010-12-1");
pListCtrl->SetItemText(0, 5, "2010-12-1");
*/ InitDataBase();//这是必须的 //设置风格
LONG lStyle;
lStyle = GetWindowLong(pListCtrl->m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(pListCtrl->m_hWnd, GWL_STYLE, lStyle);//设置style DWORD dwStyle = pListCtrl->GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
//dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
pListCtrl->SetExtendedStyle(dwStyle); //设置扩展风格 pListCtrl->InsertColumn( 0, "ID", LVCFMT_LEFT, 0 );//插入列,将宽度设置成0,在外观上就看不到此列,用来存放会员号
pListCtrl->InsertColumn( 1, "ID", LVCFMT_LEFT, 60 );
pListCtrl->InsertColumn( 2, "会议室名称", LVCFMT_LEFT, 100 );
pListCtrl->InsertColumn( 3, "容量", LVCFMT_LEFT, 60 );
pListCtrl->InsertColumn( 4, "在线", LVCFMT_LEFT, 60 );
pListCtrl->InsertColumn( 5, "开始", LVCFMT_LEFT, 140 );
pListCtrl->InsertColumn( 6, "结束", LVCFMT_LEFT, 140 ); HRESULT hr;
_RecordsetPtr pRentRecordset;
hr=pRentRecordset.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
{
AfxMessageBox("createinstance of Recordset failed!\n can`t initiate List control!");
return;
} CString strSql;
_variant_t var;
CString strValue;
int curItem=0;
strSql="SELECT * FROM Conf"; try
{
hr=pRentRecordset->Open(_variant_t(strSql),
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
if(SUCCEEDED(hr))
{
while(!pRentRecordset->adoEOF)
{
var = pRentRecordset->GetCollect((long)0);
if(var.vt != VT_NULL)
strValue = (LPCSTR)_bstr_t(var);
pListCtrl->InsertItem(curItem,strValue); var = pRentRecordset->GetCollect("ConfID");
if(var.vt != VT_NULL)
strValue = (LPCSTR)_bstr_t(var);
pListCtrl->SetItemText(curItem,1,strValue); var = pRentRecordset->GetCollect("ConfName");
if(var.vt != VT_NULL)
strValue = (LPCSTR)_bstr_t(var);
pListCtrl->SetItemText(curItem,2,strValue); var = pRentRecordset->GetCollect("MaxNum");
if(var.vt != VT_NULL)
strValue = (LPCSTR)_bstr_t(var);
pListCtrl->SetItemText(curItem,3,strValue);
var = pRentRecordset->GetCollect("OnlineNum");
if(var.vt != VT_NULL)
strValue = (LPCSTR)_bstr_t(var);
pListCtrl->SetItemText(curItem,4,strValue); var = pRentRecordset->GetCollect("StartTime");
if(var.vt != VT_NULL)
strValue = (LPCSTR)_bstr_t(var);
pListCtrl->SetItemText(curItem,5,strValue); var = pRentRecordset->GetCollect("EndTime");
if(var.vt != VT_NULL)
strValue = (LPCSTR)_bstr_t(var);
pListCtrl->SetItemText(curItem,6,strValue);
pRentRecordset->MoveNext();
curItem++;
}
}
else
{
AfxMessageBox("Open recordset fail!");
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
return;
}
pRentRecordset->Close();
pRentRecordset=NULL;}
1\添加msado15.dll.
在stdafx.h中添加如下如句
#import"C:\Program Files\Common Files\System\ado\msado15.dll"\
no_namespace\
rename("EOF","adoEOF")
2\初始化COM
如果是使用dialog创建的工程需要添加如下语句,如果是SDI中的formView的话,则不需要,架构自动添加了
在CSqlConnect06App::InitInstance()中添加如如下语句:
if (!SUCCEEDED(CoInitialize(NULL)))
{
::AfxMessageBox(_T("初始化COM失败!"));
return FALSE;
}
一定要在对话框创建语句之前添加.
CSqlConnect06Dlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
就是这几句之前.
3\建立链接
在dlg类中添加成员变量 _ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecordset;在dlg类中添加两个函数 OpenDatabase和CloseDatabase
BOOL CSqlConnect06Dlg::OpenDatabase(LPCTSTR lpszConnect, long nOptions)
{
ASSERT(m_pConnection!=NULL);
ASSERT(lpszConnect!=NULL);
ASSERT(AfxIsValidString(lpszConnect));
try
{
return SUCCEEDED(m_pConnection->Open(_bstr_t(lpszConnect),_T("sa"),_T(""),nOptions));
}
catch(_com_error& e)
{
TRACE(_T("%s\n"),e.ErrorMessage());
return FALSE;
}
}BOOL CSqlConnect06Dlg::CloseDatabase(void)
{
ASSERT(m_pConnection!=NULL);
try
{
if (m_pConnection->State& adStateOpen)
{
return SUCCEEDED(m_pConnection->Close());
}
else
{
return TRUE;
}
}
catch(_com_error& e)
{
TRACE(_T("%s\n"),e.ErrorMessage());
return FALSE;
}
//return 0;
}
在dlg类的构造函数中添加如下初始化语句
if (!SUCCEEDED(m_pConnection.CreateInstance(__uuidof(Connection))))
{
m_pConnection=NULL;
TRACE(_T("Database CreateInSTance Failed!"));
}
if (!SUCCEEDED(m_pRecordset.CreateInstance(__uuidof(Recordset))))
{
m_pRecordset=NULL;
TRACE(_T("Recordset CreateInstance Failed!"));
}
if (!SUCCEEDED(m_pCommand.CreateInstance(__uuidof(Command))))
{
m_pCommand=NULL;
TRACE(_T("Command CreateInstance Failed!"));
}
CString strConnect=_T("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=DB_jiecai;Data Source=ADW");
if (!OpenDatabase(strConnect,adModeUnknown))
{
AfxMessageBox(_T("数据库打开失败"));
return;
}
m_pCommand->ActiveConnection=m_pConnection;
}
在析构函中添加
CSqlConnect06Dlg::~CSqlConnect06Dlg()
{
m_pConnection->Close();
}在这时介绍一个获取链接语句的好方法:
CString strConnect=_T("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=DB_jiecai;Data Source=ADW");
新建一个txt文件,将其后缀改为udl双击打开它.在第一个选项卡(提供程序)中选择Microsoft OLE DB provider for SQL Server.在第二个选项卡选择服务器名称,输入链接的用户名称和密码,选择你要链接的数据库,点测试连接.成功后点确定.
将文件重新命名为txt文件,打开,文件中的最后一句就是连接语句了.本人也正在学习数据库方面的编程,在这里权当复习了.