基于对话框的MFC如何连接数据库
我做了一个C/S模式的程序,不太懂数据库方面程序的,暂时数据库是ACCESS建立的。我现在服务器这端需要根据一个CString类型的变量(应该是数据库的主键)来从数据库内...
我做了一个C/S模式的程序,不太懂数据库方面程序的,暂时数据库是ACCESS建立的。我现在服务器这端需要根据一个CString类型的变量(应该是数据库的主键)来从数据库内取回一个值(假设也为CSTRING类型),只需要这个功能,不知道应该如何实现,希望高手帮忙,最好有源代码,高分感谢!
展开
2个回答
展开全部
ADO的三个核心对象
Connection对象
Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 Recordset和Command对象都有一个ActiveConnection属性,该属性用来引用Connection对象。
Command对象
Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
Recordset对象
Recordset对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。每一列都存放在Recordset的Fields集合中的一个Field对象中。
在VC中利用ADO访问数据库
1.新建一个基于对话框的工程,名为ADO。
2.在对话框中放一ListBox和一个Button控件。
3.在使用时须导入MSADO15.dll,方法是在StdAfx.h中#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlh和MSADO15.tli加到工程中,其目的只是方便我们查看而已。并不是编译需要它。
ADO也是COM组件,须初始化COM库方法是CoInitialize(NULL);使用完后须CoUninitialize();
代码如下:
void CAdoDlg::OnBtnQuery()
{
int i,j;
char mdbPath[256]; //mdb文件路径
char connstr[512]; //连接字符串
char connstr2[512]; //连接字符串2
memset(mdbPath,0,256);
memset(connstr,0,512);
memset(connstr2,0,512);
strcpy(connstr,"driver={Microsoft Access Driver (*.mdb)};dbq=");
if(!::GetCurrentDirectory(256,mdbPath))
{
AfxMessageBox("获取数据库路径失败!");
return;
}
if(mdbPath[strlen(mdbPath)-1]!='\\')
mdbPath[strlen(mdbPath)]='\\';
strcat(mdbPath,"data.mdb");
strcat(connstr,mdbPath);
for(i=0,j=0;i<strlen(connstr);i++,j++)
{
if(connstr[i]!='\\')
connstr2[j]=connstr[i];
else
{
connstr2[j]='\\';
connstr2[++j]='\\';
}
}
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));//产生connection智能指针
_RecordsetPtr pRst(__uuidof(Recordset)); //产生recordset智能指针
pConn->Open(connstr2, "","",adModeUnknown); //打开数据库
pRst->Open("select * from user",_variant_t((IDispatch*)pConn),adOpenStatic,adLockOptimistic,adCmdText);
while(!pRst->rsEOF)//将查询到的数据加到列表框
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
(_bstr_t)pRst->GetCollect("name"));
pRst->MoveNext();
}
//插入一条记录
pRst->AddNew();
pRst->PutCollect("name",_variant_t("sun"));
pRst->PutCollect("age",_variant_t((long)21));
pRst->Update();
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
CoUninitialize();
}
Connection对象
Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 Recordset和Command对象都有一个ActiveConnection属性,该属性用来引用Connection对象。
Command对象
Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
Recordset对象
Recordset对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。每一列都存放在Recordset的Fields集合中的一个Field对象中。
在VC中利用ADO访问数据库
1.新建一个基于对话框的工程,名为ADO。
2.在对话框中放一ListBox和一个Button控件。
3.在使用时须导入MSADO15.dll,方法是在StdAfx.h中#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlh和MSADO15.tli加到工程中,其目的只是方便我们查看而已。并不是编译需要它。
ADO也是COM组件,须初始化COM库方法是CoInitialize(NULL);使用完后须CoUninitialize();
代码如下:
void CAdoDlg::OnBtnQuery()
{
int i,j;
char mdbPath[256]; //mdb文件路径
char connstr[512]; //连接字符串
char connstr2[512]; //连接字符串2
memset(mdbPath,0,256);
memset(connstr,0,512);
memset(connstr2,0,512);
strcpy(connstr,"driver={Microsoft Access Driver (*.mdb)};dbq=");
if(!::GetCurrentDirectory(256,mdbPath))
{
AfxMessageBox("获取数据库路径失败!");
return;
}
if(mdbPath[strlen(mdbPath)-1]!='\\')
mdbPath[strlen(mdbPath)]='\\';
strcat(mdbPath,"data.mdb");
strcat(connstr,mdbPath);
for(i=0,j=0;i<strlen(connstr);i++,j++)
{
if(connstr[i]!='\\')
connstr2[j]=connstr[i];
else
{
connstr2[j]='\\';
connstr2[++j]='\\';
}
}
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));//产生connection智能指针
_RecordsetPtr pRst(__uuidof(Recordset)); //产生recordset智能指针
pConn->Open(connstr2, "","",adModeUnknown); //打开数据库
pRst->Open("select * from user",_variant_t((IDispatch*)pConn),adOpenStatic,adLockOptimistic,adCmdText);
while(!pRst->rsEOF)//将查询到的数据加到列表框
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
(_bstr_t)pRst->GetCollect("name"));
pRst->MoveNext();
}
//插入一条记录
pRst->AddNew();
pRst->PutCollect("name",_variant_t("sun"));
pRst->PutCollect("age",_variant_t((long)21));
pRst->Update();
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
CoUninitialize();
}
参考资料: http://hi.bccn.net/space.php?uid=112902&do=blog&id=11034
展开全部
我现在服务器这端需要根据一个CString类型的变量(应该是数据库的主键)来从数据库内取回一个值(假设也为),只需要这个功能
晕了!!
数据库有CSTRING类型的数据吗?没有!!CSTRING在VC中是个类。
你可以把CSTRING类的数据赋值给一个字符串变量。
关于如何读写你可以参考下面的代码
CString strName,strAge;
strName=strAge="";
VARIANT *var;
COleVariant cov;
m_listCtl.ResetContent(); //这是一个list控件
CDaoDatabase m_mydb; //定义数据库变量
m_mydb.Open("mydb.mdb"); //打开数据库
CDaoTableDef m_mytable(&m_mydb); //通过数据库定义table变量
m_mytable.Open("雇员"); //打开这个 表
CDaoRecordset m_myset; //定义记录集对象
m_myset.Open(&m_mytable,dbOpenTable,0); //通过打开 表 来填充记录集
while(!m_myset.IsEOF())
{
m_myset.GetFieldValue("名字",cov); //得到 “名字", 字段的 值
var=(LPVARIANT)cov;
if(var->vt!=VT_NULL)
strName.Format("%s",var->pbVal);
m_myset.GetFieldValue("职务",cov);
var=(LPVARIANT)cov;
if(var->vt!=VT_NULL)
strAge.Format("%s",var->pbVal);
m_listCtl.AddString(strName+"----->"+strAge);
m_myset.MoveNext(); //下一条记录
}
晕了!!
数据库有CSTRING类型的数据吗?没有!!CSTRING在VC中是个类。
你可以把CSTRING类的数据赋值给一个字符串变量。
关于如何读写你可以参考下面的代码
CString strName,strAge;
strName=strAge="";
VARIANT *var;
COleVariant cov;
m_listCtl.ResetContent(); //这是一个list控件
CDaoDatabase m_mydb; //定义数据库变量
m_mydb.Open("mydb.mdb"); //打开数据库
CDaoTableDef m_mytable(&m_mydb); //通过数据库定义table变量
m_mytable.Open("雇员"); //打开这个 表
CDaoRecordset m_myset; //定义记录集对象
m_myset.Open(&m_mytable,dbOpenTable,0); //通过打开 表 来填充记录集
while(!m_myset.IsEOF())
{
m_myset.GetFieldValue("名字",cov); //得到 “名字", 字段的 值
var=(LPVARIANT)cov;
if(var->vt!=VT_NULL)
strName.Format("%s",var->pbVal);
m_myset.GetFieldValue("职务",cov);
var=(LPVARIANT)cov;
if(var->vt!=VT_NULL)
strAge.Format("%s",var->pbVal);
m_listCtl.AddString(strName+"----->"+strAge);
m_myset.MoveNext(); //下一条记录
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询