简单的数据库问题?

简单的数据库问题?,第1张

RecordSource属性指定通过窗体上的被绑定的控件访问的记录的来源。

如果将 RecordSource 属性设置为数据库中的一个存在的表的名称,则那张表中的所有字段对附属于Data控件的被绑定的控件都是可见的。对于表类型的记录集(RecordsetType = vbRSTypeTable),被检索的记录的顺序由 Recordset 的 Index 属性选择的 Index 对象来决定。对于 dynaset 类型和快照类型的 Recordset 对象,可以通过在 Data 控件的 Recordset 属性中使用带有 Order By 子句的 SQL 语句的方法来对记录排序。否则,不以特别的顺序返回数据。

如果将 RecordSource 顺序设置为数据库中一个存在的 QueryDef 的名称,则由 QueryDef 返回的所有字段对附属于 Data 控件的被绑定的控件都是可见的。被检索的记录的顺序由 QueryDef 对象的查询设置。例如,QueryDef 可以包含一个 ORDER BY 子句来改变由 Recordset 返回的由 Data 控件创建的记录的顺序,或者包含一个 WHERE 子句来过滤记录。如果 QueryDef yDef 不指明顺序, 将不以特别的顺序返回数据。

注意 在设计时,显示在 RecordSource 属性的“属性”窗口中的 QueryDef 对象被过滤,从而只显示 Data 控件可使用的 QueryDef 对象。具有参数的 QueryDef 对象,以及具有如下类型的 QueryDef 对象不被显示:dbQAction、dbQCrosstab、dbQSQLPassThrough 和 dbQSetOperation。

如果将 RecordSource 属性设置为一个返回记录的 SQL 语句,则该 SQL 查询返回的所有字段对附属于 Data 控件的被绑定的控件都是可见的。此语句可以包含一个 ORDER BY 子句来改变由 Data 控件创建的 Recordset 返回的记录的顺序,或者包含一个WHERE子句来过滤记录。如果在 Database 和 Connect 属性中指定的数据库不是 Microsoft Jet 引擎数据库,而且 dbSQLPassThrough 选项在 Options 属性中被设置,则 SQL 查询必须使用该数据库引擎所要求的语法。

注意 每当 QueryDef 或 SQL 语句从一个表达式返回一个值时,该表达式的字段名称由 Microsoft Jet 数据库引擎自动地创建。一般地,该名称为 Expr1 后跟一个从 000 开始的三个字符的数字。例如,第一个表达式将被命名为:Expr1000。

在大多数情况下,需要为表达式指定别名,从而知道绑定到被绑定的控件上的列的名称。关于更多的信息,请参阅 SQL SELECT 语句的 AS 子句。

当在运行时改变 RecordSource 属性的值后,必须使用 Refresh 方法使改变生效,并重建 Recordset。

在运行时,如果 Recordset 指定了一个非法的 Table 名称、QueryDef 名称,或者包含了非法的 SQL 语法,则产生一个可捕获的错误。如果此错误在初始的 Form_Load 过程中发生,则该错误是不可捕获的。

注意 请保证每个被绑定的控件都对其 DataField 属性具有合法设置。如果改变了 Data 控件的 RecordSource 属性的设置并随后使用 Refresh,则 Recordset 标识新对象。这可能使被绑定的控件的 DataField 设置失效,并导致一个可捕获的错误。

数据类型

在MFC中与SQL数据库相关联的主要是两个类:CDatabase类与CRecordeset类。

1.将SQL中的字段显示在Clistctrl空间的列名中

[cpp] view plain copy

m_gl.Open(CRecordset::dynaset)//打开ODBC连接的数据库  

    short nfilecount=m_gl.GetODBCFieldCount()//获取表中的字段数  

    CODBCFieldInfo fieldinfo//用于存储字段信息  

    for(int n=0n<nfilecountn++)  

    {  

        m_gl.GetODBCFieldInfo(n,fieldinfo)//返回某一字段索引的字段信息 m_strName保存的是字段名  

        int nWidth=m_list.GetStringWidth(fieldinfo.m_strName)+15//确定列头的显示长度  

        m_list.InsertColumn(n,fieldinfo.m_strName,LVCFMT_LEFT,nWidth)//在Clistctrl控件中插入列  

    }  

  

  

    CString strvalue  

    m_gl.MoveFirst()  

    int ncount=0  

    while(!m_gl.IsEOF())  

    {  

  

        m_list.InsertItem(ncount,strvalue)  

        //for(short j=0j<nfilecountj++)  

        //{  

        //  m_gl.GetFieldValue(j,strvalue)//获取某个字段的信息  

        //  m_list.SetItemText(ncount,j,strvalue)//在Clistctrl控件中写入数据  

        //}  

        CString m_ID  

        m_ID.Format("%d",m_gl.m_ID)  

        m_list.SetItemText(ncount,0,m_ID)  

        m_list.SetItemText(ncount,1,m_gl.column1)  

        m_list.SetItemText(ncount,2,m_gl.column2)  

        m_list.SetItemText(ncount,3,m_gl.column3)  

        m_list.SetItemText(ncount,4,m_gl.column4)  

        m_list.SetItemText(ncount,5,m_gl.column4)  

        m_gl.MoveNext()  

        ncount++  

      

    }  

    m_gl.Close()  

    m_db.Close()

2.删除表中的某一行:

[cpp] view plain copy

int nIdxingdb=nIdx1+1  

    m_gl.Open (CRecordset::dynaset)//打开数据库  

    m_gl.SetAbsolutePosition(nIdxingdb)//设置数据库的记录位置  

    m_gl.Delete()//删除记录  

    m_gl.Close()

3.增加到记录中一行:

[cpp] view plain copy

m_gl.AddNew()  

    m_gl.SetFieldNull(NULL,false)  

  

    m_gl.column1 = r.Name  

    m_gl.column5 = r.Photo  

    m_gl.column2 = r.Depart  

    m_gl.column3 =r.IsIntern  

    m_gl.column4=r.Phone  

    m_gl.Update()  

    m_gl.Requery()  

  

    m_gl.MoveFirst()

比如在你的工程目录中建一个 dbf\vir.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=MyImageDBQ=dbf\\vir.mdbDEFAULTDIR=dbf")//注册本地数据库数据源

m_db.OpenEx("DSN=MyImage",CDatabase::noOdbcDialog)//MyImage是数据源名称

}

4.在前面的函数体之前创建全局变量CDatabase m_dbCRecordset 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()//将记录移到下一行

}

}

本程序是自动注册数据源的,当然可以手动注册数据源,关于如何注册数据源并不麻烦,叙述起来不太方面,你就参考其他的吧。不过建议不用手动注册数据源,这样你地程序移植性不好.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9698933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存