关于数据库与Mfc的链接

2024-12-05 05:27:30
推荐回答(3个)
回答1:

数据库编程的思路都是一致的:打开数据库连接-》执行SQL语句-》获得查询结果-》关闭数据库连接,不同的数据库访问技术有不同的要求,比如用C API诘问MySql数据库的时候还得释放查询结果集。
ODBC访问数据库得配置数据源

配置ODBC数据源:打开控制面板下的“数据源”,弹出“ODBC数据源管理器”,选择DSN选项卡-》添加->你选择你的SQL Server选项,单击完成。如图然后你再按照向导提示添加。

代码中用ODBC访问数据库你得加上afxdb.h头文件,
用CDataBase 类连接数据库、CRecordSet类查询记录。
现在在VC访问数据库常用的是ADO访问,你可以找一下我前面的回答有ADO访问数据库的步骤。

CDataBase m_cODBCDb;
用CDataBase类的OpenEx()函数打开数据库连接。连接字符串你自己构造一下。
定义一个与上面数据库相关的查询对象
CRecordSet m_cODBCRec(&m_cODBCDb);
用这个查询对象的open方法就可以执行SQL语句与数据库交互了;

现在用VC、MFC访问数据库常用的技术是ADO,学学这个吧。难点、但很实用!

导入ADO库
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF")
2、用导入的动态库的指针操作数据库.
打开数据库连接
_ConnectionPtr m_pConn; // 数据库连接指针
// 创建Conneciton对象
m_pConn.CreateInstance(_T("ADODB.Connection"));
用ConnectionPtr 的open方法m_pConn->Open(_bstr_t(m_sConn),
_T(""), _T(""), lOptions));
m_sConn为你连接数据库的信息,你应该按照你的要求打开数据库

然后你用打开的那个连接进行操作数据库。比如
_RecordsetPtr pRec = m_pConn->Execute(_bstr_t(pszSql), NULL, CmdText);
pszSql 就你要操作数据库的SQL语句。在这个SQL语句里你可以创建表、更新表等。

用ADO访问的时候要求初始他COM库和释放COM对象
// 初始化COM环境(库)
::CoInitialize(NULL);
//释放COM对象
::CoUninitialize();

回答2:

这个你找对人了。
MFC方式下ado连接数据库,针对单文档、多文挡、基本对话框均可,以下基于对话框(原创):
1、xx.cpp(初始化com库,主APP文件)
BOOL xxApp::InitInstance()
{
AfxEnableControlContainer();
::CoInitialize(NULL);//初始化COM库
}
int xxApp::ExitInstance()
{
::CoUninitialize();//清除COM库
return CWinApp::ExitInstance();
}

2、xxDlg.h(声明数据库连接指针)
class xxDlg : public CDialog
{
public:
...
protected:
_ConnectionPtr m_pConnection;//连接对象指针!
...
}

3、xxDlg.cpp(连接数据库,主DLG文件)
BOOL xxDlg::OnInitDialog()//切记,每一个窗口中如果有数据库操作都要进行初始化数据库连接,以下为access连接。
{
...
// TODO: Add extra initialization here
//初始化数据库连接
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
m_pConnection->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb;Persist Security Info=False;Jet OLEDB:Database Password=123456";
m_pConnection->Open("","","",adModeUnknown);
}
catch (_com_error e)
{
MessageBox("数据库连接失败!");
}
return TRUE;
}

//具体显示、修改、删除数据库
1、显示:(显示至ListControl中)
m_List.DeleteAllItems();
_RecordsetPtr pQueryRecordset;
pQueryRecordset.CreateInstance(__uuidof(Recordset));
CString strSQL;
strSQL="select name from [t1] where [degree]='1'";
//打开记录集
try
{
pQueryRecordset->Open(_variant_t(strSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error* e)
{
AfxMessageBox(e->ErrorMessage());
return;
}
//判断记录集有没有记录
if((pQueryRecordset->BOF)&&(pQueryRecordset->adoEOF))//如果无记录
MessageBox("无相关记录!");
else
{
_variant_t var;
CString strValue;
int curItem=0;
//更新ListControl控件
try
{
while(!pQueryRecordset->adoEOF)//如果记录集不在末尾!
{
//1.id
var=pQueryRecordset->GetCollect("id");
if(var.vt!=VT_NULL)
{
strValue = (LPCSTR)_bstr_t(var);
m_List.InsertItem(curItem,strValue);
}
//2.name
var=pQueryRecordset->GetCollect("name");
if(var.vt!=VT_NULL)
{
strValue = (LPCSTR)_bstr_t(var);
m_List.SetItemText(curItem,1,strValue);
}
//3.xx
...
//游标移动到下一条记录
pQueryRecordset->MoveNext();
curItem++;
}
}
catch(_com_error* e)
{
AfxMessageBox(e->ErrorMessage());
}
}
pQueryRecordset->Close();//关闭记录集
pQueryRecordset=NULL;//指针设为空
2、修改
UpdateData(TRUE);
CString sql;
sql="update [t1] set [name]='"+m_name+"' where [id]="+id;
_CommandPtr pCommand;//定义命令指针
pCommand.CreateInstance(__uuidof(Command));//创建命令对象
pCommand->ActiveConnection=m_pConnection;//指定连接
pCommand->CommandText=_bstr_t(sql);//指定sql语句
pCommand->Execute(NULL,NULL,adCmdText);//执行sql语句
pCommand=NULL;
3、删除
同上,改下sql语句即可

回答3:

不管是Access还是SQL
Server,在MFC下都可以通过ADO进行数据库连接。
Access连接的时候只需要传入数据库文件的存放路径就行;
SQL
Server连接的时候,得传入服务器名、数据库名、用户名、用户密码等参数。
ADO封装类在网上有下的,你可以搜一下!
有问题加Q说!