首页 > C++ > C++数据库简易操作

C++数据库简易操作

2013年2月27日 发表评论 阅读评论

哎哟我去,哥假期为了赚点别的老师的小外快,努力过年搬砖,搞个excel,还出了诸多问题,然后遇到的最麻烦的一个问题就是,读取速度太慢了,慢的令人发指,经过我对别人给的接口的源文件各种优化,4W多条也要40+s的时间,然后今天去跟那个老师聊了一下,他说,他们原本的数据时mdb格式的数据库文件,然后为了方便观察(保守估计老师电脑没有装Access),于是一师姐就把它转到excel里面去了,其实呢,源数据是mdb的,所以让我改成读取mdb,哎哟我去,早说嘛,我假期某两天的努力就这样白费了。。。话说我上次用数据库MS是当年企鹅实习的时候了,之后就再没碰过了。。。

然后找了一下简单的示例程序看看,好吧,MS比我以前学的简单很多。。。下面是正文。。

算了,不想说那么多废话。。。直接给Code好了。。反正简单易懂。。。

首先要做的事情就是添加头文件#include <afxdao.h>

下面展示如何创建数据库,插入项:

CDaoDatabase db;
CDaoRecordset RecSet(&db);

CFileFind  fFind;
BOOL bSuccess;
bSuccess=fFind.FindFile("e:\\test.mdb");  //查找文件是否存在
fFind.Close();

if(!bSuccess)
{
    db.Create("e:\\test.mdb");

    CString str = "CREATE TABLE MyTable(Name VARCHAR(32),Age VARCHAR(10));";//命令
    db.Execute(str); //创建数据库表

    RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM MyTable", 0);

    //插入数据法一
    db.Execute("INSERT INTO MyTable (Name,Age) VALUES ('AAA',10)");
    //插入数据法二
    RecSet.AddNew();
    RecSet.SetFieldValue("Name","BBB");
    RecSet.SetFieldValue("Age","20");
    RecSet.Update();

    RecSet.Close();
    db.Close();
}

其中创建mdb文件为了设置版本也可以:

db.Create("***.mdb",dbLangGeneral,dbVersion40);

还有就是创建Table也不一定要用上面那种方法:

CDaoDatabase db;
db.Create("m.mdb",dbLangGeneral,dbVersion40);
CDaoTableDef tb(&db);

tb.Create("MyTable");
tb.CreateField("ID",dbLong,4,dbVariableField|dbUpdatableField);
tb.CreateField("Name",dbText,8);
tb.CreateField("Date",dbDate,8);
tb.Append();

db.Close();
tb.Close();

下面是如何读取数据文件:

COleVariant var;        
CDaoDatabase db;
CDaoRecordset RecSet(&db);
CString sPath = "E:\\总表.mdb";
db.Open(sPath);

RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM t_power_data",NULL);

CString s1,s2;

while(!RecSet.IsEOF())
{
     var.ChangeType(VT_DATE, NULL);
    RecSet.GetFieldValue("time",var);  
    DATE _date = var.date;
    COleDateTime t;
    t.m_dt=_date;
    s2= t.Format("%Y-%m-%d-%H-%M-%S");
    AfxMessageBox(s2);

    var.ChangeType(VT_R4, NULL);
    RecSet.GetFieldValue("W_avg",var);  
    double dVal = var.fltVal;
    s1.Format("%f", dVal);
    AfxMessageBox(s1);

    RecSet.MoveNext();  //移动到下一条记录
}

RecSet.Close();
db.Close();

其中上面打开数据表的第7行代码,也可以用下面形式来代替:

 CDaoDatabase db;
   db.Open("m.mdb");
   CDaoTableDef tb(&db);
   tb.Open("MyTable");

更一般的,执行命令,实现删除修改什么的可以用下面的方法,但是数据库命令不能写错。

CDaoDatabase db;
CDaoRecordset RecSet(&db);

db.Open("e:\\test.mdb");
db.Execute("update MyTable set Name='CCC',Age='30' where Name='AAA'");
RecSet.Close();
db.Close();

也可以用下面的方法添加,修改,删除,查询数据:

添加:

CDaoDatabase db;
db.Open("m.mdb");
CDaoTableDef tb(&db);
tb.Open("MyTable");
CDaoRecordset rs(&db);
rs.Open(&tb);

rs.AddNew();
COleVariant varl;
varl.ChangeType(VT_I4);
varl.lVal = 31415926L;
rs.SetFieldValue("ID",varl);

varl.ChangeType(VT_BSTRT, NULL);
varl.SetString("张三",VT_BSTRT);
rs.SetFieldValue("Name",varl);

varl = COleVariant(COleDateTime(2012,9,28,0,1,0));
rs.SetFieldValue("Date",varl);

rs.Update();

rs.Close();
tb.Close();
db.Close();

修改数据:

CDaoDatabase db;
db.Open(“m.mdb”);
CDaoTableDef tb(&db);
tb.Open(“MyTable”);
CDaoRecordset rs(&db);
rs.Open(&tb);COleVariant varl;
rs.MoveFirst();
rs.Edit();
varl = COleVariant(“王五”,VT_BSTRT);
rs.SetFieldValue(“Name”,varl);
rs.Update();rs.Close();
tb.Close();
db.Close();

删除:

CDaoDatabase db;
db.Open("m.mdb");
CDaoTableDef tb(&db);
tb.Open("MyTable");
CDaoRecordset rs(&db);
rs.Open(&tb);

rs.MoveFirst();
rs.Delete();

查询:

CDaoDatabase db;
db.Open("m.mdb");
CDaoTableDef tb(&db);
tb.Open("MyTable");
CDaoRecordset rs(&db);
rs.Open(&tb,dbOpenDynaset);//< -注意这里

rs.FindFirst("ID=0");
rs.FindNext("ID=0");
COleVariant var;
rs.GetFieldValue("Name",var);
AfxMessageBox(V_BSTRT(&var));

【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: C++ 标签: ,