mfc操作sql
㈠ mfc中如何连接access数据库 求详细步骤
比如在你的工程目录中建一个 dbfvir.mdb //Access数据库,然后你需要做以下操作:
1.在StadAfx.h里面添加#include <afxdb.h> //新加入头文件,用于CDatabase类。
2.在StadAfx.h最后的#endif上添加#import "msado15.dll" no_namespace rename("EOF","rsEOF")
这时,你要把msado15.dll拷到与dbf同级的目录,也就是工程目录里,当然你可以该路径
3.在你自己的工程里,比如MyProc是你建的工程,添加代码
CMyPorcApp::CMyProcApp(){
CoInitialize(NULL);
sqlConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",
"DSN=MyImage;DBQ=dbf\vir.mdb;DEFAULTDIR=dbf"); //注册本地数据库数据源
m_db.OpenEx("DSN=MyImage;;",CDatabase::noOdbcDialog);//MyImage是数据源名称
}
4.在前面的函数体之前创建全局变量CDatabase m_db; CRecordset m_rec(&m_db);
5.使用数据库{
CString strSQL="select * from virdb";
BSTR bstrSQL=strSQL.AllocSysString();
m_rec.Open(CRecordset::dynaset,strSQL);
while(!m_rec.IsEOF())
{
// 使用数据库的代码,读出来的数据都是字符串型的
CString MyVirable;
m_rec.GetFieldValue("字段名",MyVirable); //将某个字段的当前行的值读到MyVirabl中
// ......
m_rec.MoveNext(); //将记录移到下一行
}
}
本程序是自动注册数据源的,当然可以手动注册数据源,关于如何注册数据源并不麻烦,叙述起来不太方面,你就参考其他的吧。不过建议不用手动注册数据源,这样你地程序移植性不好.
㈡ SQL语言和C++有什么区别
你好。根据你的年龄,可能是初学者,通俗易懂点给你讲讲吧。
首先,说说数据库。我们玩的英雄联盟,每次登录都会显示你买过的皮肤,你有的英雄。这些信息就存在数据库中,其实也没有什么,和你电脑里面的文件一种性质,不过不是存在你电脑的里面,而是存在专门存储这些信息的服务器里面,服务器也没啥,其实就是一台电脑,只不过专门用来存储数据。(嗯,还是不明白服务器,去网络查查)
sql语言呢,就是用来从这么多数据中找出自己想要的数据。举个例子,当你想看看你有多少英雄时,就通过sql语言去数据库中去进行查找,并且把结果返到界面,你就可以看到了。
这两种语言之间的区别呢。都是高级语言,但是c++属于第三代语言,sql属于第四代语言。c++语言功能比较广,前端用户界面可以进行编写,中间逻辑层代码也可以编写,数据库查询也可以编写。但是突出点是编写逻辑层,应该就是你现在学的c++内容。类,函数这些内容。但是用c++编写查询数据库的语句太麻烦,于是就有了专门用来查询数据库的语言sql。还有专门用来写前端的第四代语言像h5等。sql语言专注于数据库部分,而且用起来比较简单。而c++,什么都能做做,但是对像查询数据库这些部分太复杂。
我也是从你这个阶段过来的,当初我连什么是数据库都不知道,而且我当时都19岁了。一点点来,一定要多思考这些不会的地方,多去了解关于这部分的知识,早晚会懂的,重在坚持!
㈢ 怎么使用mfc的cdatabase类直接执行sql命令
在使用MFC的CDatabase类执行SQL命令时,首先需要创建一个CDatabase对象,然后打开数据库连接。在该示例中,我们使用了OpenEx方法并指定了数据库连接字符串。接下来,创建一个CRecordset对象,并将其数据库指针设置为刚才创建的CDatabase对象。接着可以直接执行SQL查询语句,但需注意SQL语句字符串不能以空格开头。例如,可以执行如下SQL查询:SELECT 字段或计算列 FROM 表 WHERE 条件。在执行查询后,使用CRecordset对象的Open方法以快照模式打开结果集。通过循环遍历结果集,可以使用GetFieldValue方法获取每一行数据,该方法将数据保存在一个CDBVariant变量中。值得注意的是,不能直接使用数字0作为列索引,应该从1开始计数。
此外,还可以使用其他方式获取查询结果,例如通过直接操作CRecordset对象的字段。在循环遍历过程中,可以调用MoveFirst方法定位到结果集的第一行,然后使用GetFieldValue方法按列索引获取具体字段值。完成数据获取后,记得关闭CRecordset和CDatabase对象以释放资源。
以上示例仅展示了如何使用CDatabase和CRecordset类执行简单的SQL查询。实际上,MFC还提供了丰富的API用于处理更复杂的数据操作。例如,可以使用CRecordset的AddNew和Update方法插入和更新数据,使用Delete方法删除记录。在执行这些操作时,同样需要注意正确管理数据库连接和资源。
总结来说,使用MFC的CDatabase类执行SQL命令是一个相对直接的过程,只需按照正确的步骤操作即可。关键在于正确设置数据库连接,编写正确的SQL语句,以及合理使用CRecordset类的方法来处理查询结果。通过这些步骤,可以有效地在MFC应用程序中实现数据库操作。
㈣ MFC怎么读写EXCEL文件
可以用多种方法,比如说用ODBC对excel数据库进行操作,或者说用excel 的COM接口进行编程。我找到一个例子关键代码如下:
//创建并写入Excel文件
void CRWExcel::WriteToExcel()
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile = "c:\\demo.xls"; // 要建立的Excel文件
CString sSql;
TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
sDriver, sExcelFile, sExcelFile);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 创建表结构(姓名、年龄)
sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
database.ExecuteSQL(sSql);
// 插入数值
sSql = "INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)";
database.ExecuteSQL(sSql);
}
// 关闭数据库
database.Close();
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
}
END_CATCH_ALL;
}
// 读取Excel文件
void CRWExcel::ReadFromExcel()
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "Demo.xls"; // 将被读取的Excel文件名
// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动!");
return;
}
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
TRY
{
// 打开数据库(既Excel文件)
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 设置读取的查询语句.
sSql = "SELECT Name, Age "
"FROM demo "
"ORDER BY Name ";
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 获取查询结果
while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("Name ", sItem1);
recset.GetFieldValue("Age", sItem2);
// 移到下一行
recset.MoveNext();
}
// 关闭数据库
database.Close();
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;