龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

举例介绍VC++中的ODBC编程(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
三、举例 1.查询记录 查询记录应用CRecordSet::Open()和CRecordSet::Requery()成员参数。在应用CRecordSet类对象之前,必需应用CRecordSet::Open()参数来获得有效的记录集。

三、举例

1.查询记录

查询记录应用CRecordSet::Open()和CRecordSet::Requery()成员参数。在应用CRecordSet类对象之前,必需应用CRecordSet::Open()参数来获得有效的记录集。一旦已经应用过CRecordSet::Open()参数,再次查询时就能够实际运用CRecordSet::Requery()参数。

在调用CRecordSet::Open()参数时,假如将唯一已经打开的CDatabase对象指针传给CRecordSet类对象的m_pDatabase成员变量,则应用该数据库Databnse对象建立ODBC连接;否则假如m_pDatabase为空指针,就新建唯一CDatabase类对象,并使其与缺省的数据源相连,然后停止CRecordSet类对象的初始化。缺省数据源由GetDefaultConnect()参数获得。也能够帮助所需求的SQL语句,并以它来调用CRecordSet::Open()参数,

例如:

  1. Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL); 

假如没有指定参数parameter,程式则应用缺省的SQL语句,即对在GetDefaultSQL()参数中指定的SQL语句停止操作:

  1. CString CSuper_ESSet::GetDefaultSQL()  
  2. {return _T(″[BsicData],[MinSize]″);} 

对于GetDefaultSQL()参数返回的表名,对应的缺省操作是SELECT语句,即:

  1. SELECT * FROM BasicData,MainSize 

在查询过程中,也能够利用CRecordSet的成员变量m_strFilter和m_strSort来执行要求查询和结果排序。m_strFilter为滤掉字符串,存放着SQL语句中WHERE后的要求串;m_strSort为排序字符串,存放着SQL语句中ORDER BY后的字符串。如:

  1. Super_ESSet.m_strFilter=″TYPE=‘电动机’″;  
  2. Super_ESSet.m_strSort=″VOLTAGE″;  
  3. Super_ESSet.Requery(); 

对应的SQL语句为:

  1. SELECT * FROM BasicData,MainSize  
  2. WHERE TYPE=‘电动机’  
  3. ORDER BY VOLTAGE 

除了直接赋值给m_strFilter以外,还能够应用参数parameter化。利用参数parameter化能够更直观、更方便地完成要求查询任务。应用参数parameter化的步骤如下:

S声明参变量:

  1. CString p1;  
  2. float p2; 

S在构造参数中初始化参变量:

  1. p1=_T(″″);  
  2. p2=0.0f;  
  3. m_nParams=2; 

S将参变量与对应列绑定:

  1. pFX->SetFieldType(CFieldExchange::param)  
  2. RFX_Text(pFX,_T(″P1″),p1);  
  3. RFX_Single(pFX,_T(″P2″),p2); 

完成以上步骤后就能够利用参变量停止要求查询:

  1. m_pSet->m_strFilter=″TYPE=? AND VOLTAGE=?″;m_pSet->p1=″电动机″;  
  2. m_pSet->p2=60.0;  
  3. m_pSet->Requery(); 

参变量的值按绑定的顺序替换查询字串中的“?”通配符。

假如查询的结果是多条记录,能够用CRecordSet类的参数Move()、MoveNext()、MovePrev()、MoveFirst()和MoveLast()来移动光标。

2.渐增记录

渐增记录应用AddNew()参数,要求数据库Databnse必需是以允许渐增的方法打开:

  1. m_pSet->AddNew(); //在表的末尾渐增新记录  
  2. m_pSet->SetFieldNull(&(m_pSet->m_type), FALSE);  
  3. m_pSet->m_type=″电动机″;  
  4. ……  
  5. //输入新的字段值  
  6. m_pSet->Update();  
  7. //将新记录存入数据库Databnse  
  8. m_pSet->Requery();  
  9. //重建记录集 

3.删除记录

能够直接应用Delete()参数来删除记录,并且在调用Delete()参数之后不需调用Update()参数:

  1. m_pSet->Delete();  
  2. if (!m_pSet->IsEOF())  
  3. m_pSet->MoveNext();  
  4. else 
  5. m_pSet->MoveLast(); 

4.改正记录

改正记录应用Edit()参数:

  1. m_pSet->Edit();  
  2. //改正当前记录  
  3. m_pSet->m_type=″发电机″;  
  4. //改正当前记录字段值  
  5. ……  
  6. m_pSet->Update(); //将改正结果存入数据库Databnse  
  7. m_pSet->Requery(); 

5.撤消操作

假如用户选取了渐增或者改正记录后期望放弃当前操作,能够在调用Update()参数之前调用:
CRecordSet::Move(AFX_MOVE_REFRESH)来撤消渐增或改正模式,并恢复在渐增或改正模式之前的当前记录。其中,参数parameterAFX_MOVE_REFRESH的值为零。

6.数据库Databnse连接的复用

在CRecordSet类中定义了唯一成员变量m_pDatabase:

  1. CDatabase* m_pDatabase; 

它是指向对象数据库Databnse类的指针。假如在CRecordSet类对象调用Open()参数之前,将唯一已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同的CDatabase类对象。如:

  1. CDatabase m_db;  
  2. CRecordSet m_set1,m_set2;  
  3. m_db.Open(_T(″Super_ES″)); //建立ODBC连接  
  4. m_set1.m_pDatabase=&m_db;  
  5. //m_set1复用m_db对象  
  6. m_set2.m_pDatabse=&m_db;  
  7. // m_set2复用m_db对象 

7.SQL语句的直接执行

虽然咱们能够经过CRecordSet类完成大多数的查询操作,而且在CRecordSet::Open()参数中也能够帮助SQL语句,但是有时候咱们还那样期望停止一部份更多有联系操作,例如建立新表、删除表、建立新的字段等,这时就需求应用CDatabase类直接执行SQL语句的机制。经过调用CDatabase::ExecuteSQL()参数来完成SQL语句的直接执行:

  1. BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)  
  2. {TRY  
  3. {m_pdb->ExecuteSQL(strSQL);  
  4. //直接执行SQL语句}  
  5. CATCH (CDBException,e)  
  6. {CString strMsg;  
  7. strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);  
  8. strMsg+=strSQL;  
  9. return FALSE;}  
  10. END_CATCH  
  11. return TRUE;} 

应当指出的是,由于不相同的DBMS帮助的数据操作语句不尽相同,直接执行SQL语句估计会破坏热门软件的DBMS无关性,因此在实际运用中应当慎用此类操作。

8.动态连接表

表的动态连接能够利用在调用CRecordSet::Open()参数时指定SQL语句来呈现。同唯一记录集对象只能来访具有相同框架的表,否则查询结果将无法与变量相对应。

  1. void CDB::ChangeTable()  
  2. {  
  3. if (m_pSet->IsOpen()) m_pSet->Close();  
  4. switch (m_id)  
  5. {  
  6. case 0:  
  7. m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,  
  8. ″SELECT * FROM SLOT0″);  
  9. //连接表SLOT0  
  10. m_id=1;  
  11. break;  
  12. case 1:  
  13. m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,  
  14. ″SELECT * FROM SLOT1″); //连接表SLOT1  
  15. m_id=0;  
  16. break; }} 

9.动态连接数据库Databnse

能够经过赋与CRecordSet类对象参数parameterm_pDatabase来连接不相同数据库Databnse的CDatabase对象指针,从而呈现动态连接数据库Databnse。

  1. void CDB::ChangeConnect()  
  2. {CDatabase* pdb=m_pSet->m_pDatabase;  
  3. pdb->Close();  
  4. switch (m_id)  
  5. {  
  6. case 0:  
  7. if (!pdb->Open(_T(″Super_ES″)))  
  8. //连接数据源Super_ES  
  9. {  
  10. AfxMessageBox(″数据源Super_ES打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);  
  11. exit(0);  
  12. }  
  13. m_id=1;  
  14. break;  
  15. case 1:  
  16. if (!pdb->Open(_T(″Motor″)))  
  17. //连接数据源Motor  
  18. {  
  19. AfxMessageBox(″数据源Motor打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);  
  20. exit(0);  
  21. }  
  22. m_id=0;  
  23. break; }} 

总结:Visual C++中的ODBC类库能够帮助程式员完成绝大多数的数据库Databnse操作。利用ODBC技能使得程式员从具体的DBMS中解脱出来,从而能够递减热门软件开发的务工量,缩短开发周期,并升高效率和热门软件的可靠性。希望本文能对你有帮助。

精彩图集

赞助商链接