北京八维教育在CB5中使用ADO数据库编程
ADO数据库编程
long Options //指示如何计算Commandtext;如:AdCmdText是按命令的文本定义计算。
eg:使用Command对象执行SQL命令。
//创建Command对象
hr=m_pCommand.CreateInstance("mand");
if(FAILED(hr))
return 0;
}
catch(_com_error e)
{
//显示错误信息
CString errormessage;
errormessage.Format("Connection 对象执行SQL命令--操作错误!\r\n错误信息:%s,%s,e.ErrorMessage(),(LPCTSTR)e.Description());
AfxMessageBox(errormessage);
}
2)Command对象调用Execute
_RecordsetPtr Execute(
VARIANT* RecordsAffcted, // 返回此次操作所影响的记录数。
try
{
m_pCommand->ActiveConnection=m_pConnection;
m_pCommand->CommandText="INSERT INTO users(ID,username,old,birthday)
long Options //数据库打开选项,标识数据库访问权限。默认为:adModeUnknown;
);
在使用Connection对象之前还需要先使用COM接口CocreateInstance创建该对象,其函数原型如下:
数据库系统实验报告ADO连接数据库
图4-1 新建项目CREATE TABLE course (Cno char(4) NOT NULL,Cname char(40) DEFAULT NULL,Cpno char(4) DEFAULT NULL,Ccredit smallint DEFAULT NULL,PRIMARY KEY (Cno)) ;---- 转存表中的数据'course'--INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('1', '数据库', '5', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('2', '数学', NULL, 2);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('3', '信息系统', '1', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('4', '操作系统', '6', 3);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('5', '数据结构', '7', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('6', '数据处理', NULL, 2);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUESINSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215123', '王敏', '女', 18, 'MA');INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215125', '张立', '男', 19, 'IS');INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215128', '陈冬', '男', 18, 'IS');---- 限制表'course'--ALTER TABLE courseADD CONSTRAINT course_ibfk_1 FOREIGN KEY (Cpno) REFERENCES course (Cno);---- 限制表'sc'--ALTER TABLE scADD CONSTRAINT sc_ibfk_1 FOREIGN KEY (Sno) REFERENCES student (Sno); ALTER TABLE scADD CONSTRAINT sc_ibfk_2 FOREIGN KEY (Cno) REFERENCES course (Cno);3.在应用程序AdoConnection类的InitInstance()函数中添加如下语句,初始化COM库AfxOleInit();首先找到源文件AdoConnection.cpp。
在VC中使用ADO开发数据库应用程序
_RecordsetPtr接口的使用方法和CDaoDatabase类似, 通过以下代码的比较,你会发现使用_RecordsetPtr接口非常 简单(以下代码使用上面已经创建的数据连接):
代码7:使用CDaoDatabase执行SQL语句 CDaoRecordset MySet = new CDaoRecordset(MyD b); MySet->Open(AFX_DAO_USE_DEFAULT_TYPE," SELECT * FROM t_samp");
3、ADO接口简介
ADO库包含三个基本接口:_ConnectionPtr接口、 _CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。通 常使用它来创建一个数据连接或执行一条不返回任何结果的 SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一 个记录集不是一个好的使用方法。通常同CDatabase一样,使 用它创建一个数据连接,然后使用其它对象执行数据输入输 出操作。 _CommandPtr接口返回一个记录集。它提供了一种简 单的方法来执行返回记录集的存储过程和SQL语句。在使用 _CommandPtr接口时,你可以利用全局_ConnectionPtr接口, 也可以在_CommandPtr接口里直接使用连接串。如果你只执 行一次或几次数据访问操作,后者是比较好的选择。但如果 你要频繁访问数据库,并要返回很多记录集,那么,你应该 使用全局_ConnectionPtr接口创建一个数据连接,然后使用 _CommandPtr接口执行存储过程和SQL语句。
但是,OLE DB 应用程序编程接口的目的是为各种应用程 序提供最佳的功能,它并不符合简单化的要求。您需要的 API 应该是一座连接应用程序和 OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
最新MFC下使用ADO连接数据库
M F C下使用A D O连接数据库MFC下使用ADO读写Access数据库实例一、原型系统描述 (2)二、数据库表设计 (2)三、数据库编程 (2)1.新建MFC基于对话框项目 (2)2.用#import指令引入ADO类型库 (2)3.创建数据库操作类CADODatabase (3)3.1为CADODatabase添加两个成员变量 (3)3.2添加OpenDatabase函数 (3)3.3添加CloseDatabase函数 (4)3.4添加Select函数 (5)3.5添加Execute函数 (6)四、MFC界面编程 (6)1.在对话框中添加控件 (6)2.在程序启动时初始化列表框,并连接数据库 (7)2.1初始化列表框 (7)2.2连接数据库 (7)3.添加查询功能 (8)4.添加新增记录功能 (9)五、使用Datagrid ActiveX控件 (10)1.添加Datagrid控件 (10)2.创建数据库 (11)3.创建数据库操作类CADODatabase (12)4.使用Datagrid (12)4.1 绑定数据源 (12)4.2 添加记录 (13)说明:本文以“学生信息管理”系统雏形为例子,介绍在MFC下如何使用ADO连接数据库编程,并给出示例代码。
下面内容第一至四节介绍如何采用ADO连接数据库、关闭数据、执行sql语句及如何用另一种方式执行常用的select语句。
第五节介绍如何使用Datagrid控件:建立_RecordsetPtr对象与Datagrid控件之间的绑定,通过改变_RecordsetPtr对象的内容更新数据库表的记录。
第一至四节的内容请参考代码“CtrlListDatabase.rar”,第五节内容请参考“Datagrid.rar”请同学们结合课程内容自主学习,将所学到的技术应用到项目实训中。
一、原型系统描述本程序为一个学生信息管理系统雏形。
程序界面如下图左图所示。
用户在姓名栏输入查询字段,列表框中列出查询结果。
VC中使用ADO控件的基本功能
VC中使用ADO控件的基本功能ADO(ActiveX Data Objects)是一组可以访问数据库的组件,它提供了一种统一的接口,允许开发者使用不同的编程语言对各种类型的数据存储进行访问和操作。
在VC中使用ADO控件可以方便地进行数据库操作,本文将介绍ADO的基本功能及相关用法。
1.引入ADO库在VC项目中使用ADO之前,首先需要引入ADO库。
可以通过以下步骤引入ADO库:a)打开VC中的项目;b)选择“项目”->“属性”;c)在属性对话框中选择“配置属性”->“常规”->“使用MFC”;d)在“使用MFC”中选择“使用共享DLL”,并点击“应用”;e)在属性对话框中选择“配置属性”->“链接器”->“输入”;f) 在“附加依赖项”中加入“odbc32.lib”和“odbccp32.lib”;g)点击“应用”和“确定”。
2.连接数据库使用ADO控件前,需要建立与数据库的连接。
连接数据库常用的一种方法是使用连接字符串。
连接字符串是一串字符,包含了数据库的相关信息,如数据库类型、地址、用户名、密码等。
可以使用以下代码建立与数据库的连接:```cpp#include <windows.h>void ConnectToDatabase_ConnectionPtr pConn;HRESULT hr = pConn.CreateInstance(__uuidof(Connection));if (SUCCEEDED(hr))_bstr_t connStr = "Provider=SQLOLEDB;DataSource=YourServerName;Initial Catalog=YourDatabaseName;UserId=YourUserId;Password=YourPassword;";hr = pConn->Open(connStr, "", "", adConnectUnspecified);if (SUCCEEDED(hr))//连接成功,可以进行数据库操作}}```在代码中,使用_ConnectionPtr表示连接对象,CreateInstance函数创建连接对象的实例,并使用Open函数打开数据库连接。
C#中用ADO.NET连接SQL Server数据库教学方法探讨
C#中用连接SQL Server数据库教学方法探讨张丽景【摘要】This paper aimed at the c # using to connect SQL Server database knowledge and combined the teaching experience of the course database of Lanzhou Petrochemical Vocational and Technical College. Starting from the actual cognitive ability of students, this paper comprehensively used case teaching method and problem-driven type teaching method and provides a detailed teaching design scheme with the project teaching as a clue, interesting teaching as the guiding ideology, and visualizes teaching as the core.%本文针对C#中用连接SQL Server数据库知识点,结合兰州石化职业技术学院数据库课程教学经验,从学生的实际认知能力出发,综合运用案例式教学法和问题驱动式教学法,以项目教学为线索,趣味教学为指导思想,形象化教学为核心,给出了详细的教学设计方案。
【期刊名称】《岳阳职业技术学院学报》【年(卷),期】2014(000)006【总页数】3页(P69-71)【关键词】;SQL Server数据库;案例式教学法;问题驱动式教学法【作者】张丽景【作者单位】兰州石化职业技术学院信息处理与控制工程系,甘肃兰州 730060【正文语种】中文【中图分类】TP311.13C#中利用连接SQL Server数据库是一门非常成熟的技术,操作方法简单,步骤清晰[1]。
在VisualC中用ADO进行数据库编程.
在Visual C++中用ADO进行数据库编程C++中用学习各种高级外挂制作技术,马上去百度搜索"魔鬼作坊",点击第一个站进入,快速成为做挂达人。
1.生成应用程序框架并初始化OLE/COM库环境创建一个标准的MFC AppWizard(exe应用程序,然后在使用ADO数据库的InitInstance 函数中初始化OLE/COM库(因为ADO库是一个COM DLL库。
本例为:BOOL CAdotestDlg::OnInitDialog({::CoInitialize(NULL;//初始化OLE/COM库环境}程序最后要调用::CoUninitialize(;//释放程序占用的COM资源。
另外:m_pRecordset->Close(;注意!!!不要多次关闭!!!!!!!!!!!!m_pConnection->Close(;m_pRecordset=NULL;m_pConnection=NULL;2.引入ADO库文件使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下:#import"C:\Program Files\common files\system\ado\msado15.dll"no_namespace rename("EOF","adoEOF"ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll中,在其内部称为类型库。
类型库描述了自治接口,以及C++使用的COM vtable接口。
当使用#import 指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。
这些头文件具有.tli和.tlh扩展名,读者可以在项目的目录下找到这两个文件。
在C++程序代码中调用的ADO类要在这些文件中定义。
使用ADO数据库编程
使用ADO数据库编程ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术。
ADO非常简单易用,甚至比ODBC API、DAO、RDO都要容易使用,并不失灵活性。
本节将讨论如何使用ADO进行数据库的开发,介绍ADO库定义文件,讨论用Connection对象连接数据库、通过Connection、Command对象执行SQL 命令及利用Recordset对象取得结果记录集进行查询、处理,下面分别介绍。
1.1 导入ADO的动态链接库用#import指令引入ADO类型库,在使用的文件中加入如下语句#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 这句话的作用是编译的时候系统会为我们生成msado15.tlh,ado15.tli两个头文件来定义ADO库,即加载ADO动态库(msado15.dll)。
其中,no_namespace表明不使用命名空间,rename("EOF","adoEOF")表明把ADO中用到的EOF改为adoEOF,防止发生命名冲突。
几点说明:❑该代码需要在一行中完成,如果写成两行或者多行,行末要加上“”符号,表示把这几行看成一行。
❑读者的编程环境中msado15.dll不一定在这个目录下,请按实际情况修改。
❑在编译的时候可能会出现warning C4146警告,对此微软在MSDN中作了说明,并建议不要理会这个警告。
1.2 初始化ADO控件环境ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM 库环境。
初始化OLE/COM库环境的代码如下:::CoInitialize(NULL); /*初始化OLE/COM库环境*/ 别忘了最后要释放资源:::CoUninitialize();/*释放程式占用的COM 资源*/ 如果需要界面支持可以通过另外一个函数实现。
ADO编程基础、连接对象及应用
(3)Close方法 (3)Close方法 语法格式如下: 语法格式如下: 语法格式如下: HRESULT HRESULT Close(); Close();
ADO记录集对象
Open方法中的参数说明如表16.2所示。 Open方法中的参数说明如表16.2所示。 Open方法中的参数说明如表16.2所示。 表16.2 表16.2 Open方法中的参数说明 Open方法中的参数说明 参 数 描 述 参 数 描 述 Source Source 指定记录集的数据源 指定记录集的数据源 ActiveConnection 指定记录集对象使用的连接 ActiveConnection ActiveConnection 指定记录集对象使用的连接 CursorType 指定使用的游标类型 CursorType CursorType 指定使用的游标类型 LockType 指定锁定类型 LockType 指定锁定类型 Options 指定数据源语句的类型 Options 指定数据源语句的类型 (2)AddNew方法 (2)AddNew方法 (2)AddNew方法 语法格式如下: 语法格式如下: HRESULT HRESULT AddNew(const AddNew(const _variant_t _variant_t &FieldList &FieldList = = vtMissing,const vtMissing,const _variant_t _variant_t &values &values = = vtMissing); vtMissing); t FieldList:指定字段列表数组。 t FieldList:指定字段列表数组。 t values:指定字段值数组。 t values:指定字段值数组。 (3)Update方法 (3)Update方法 (3)Update方法 语法格式如下: 语法格式如下: HRESULT HRESULT Update Update (const (const _variant_t _variant_t &Fields &Fields = = vtMissing,const vtMissing,const _variant_t _variant_t &values &values = = vtMissing); vtMissing); t t t t Fields:指定字段数组。 Fields:指定字段数组。 values:指定字段值数组。 values:指定字段值数组。
ado方式操作数据库类
ado方式操作数据库类VC/MFC数据库新任版主zyq5945(竹叶青)在数据库版开设帖子整理的一些ADO数据库入门与例子,为了表示支持我在其中回复了一个自己平时用的ado操作数据库的类。
怎奈论坛对回帖字数有限制,结果只贴了头文件......不过竹叶青版主邀请我把这个类整理到博客里以便分享,我觉得这个办法不错。
不过既然要整理到博客里就应该更正式一些,所以花些时间规范了一下这个类,并且制作了一个简单的使用范例,也算是对竹版的支持,对数据库版的一点小小的贡献吧。
好久没写博客了,其实应该多说两句介绍一下这个类和其简单的使用。
不过自己在数据库方面确实知之甚少,这个类其实也是抄来的,只不过在自己的使用过程中“本土化”了一下,呵呵。
所以就不班门弄斧了,直接上代码吧,希望能对有志于涉足于数据库应用技术的同僚们有所帮助,按竹版的话说算是“入门实例”吧。
使用范例本例中操作的数据库为ACCESS2003,操作方式为本地连接,数据库带密码类实现代码头文件[cpp] view plaincopy#pragma once #include "math.h" #import "MSADO15.DLL" rename_namespace("ADOWE") rename("EOF","EndOfFile") using namespace ADOWE; class CDBAdo { public:_CommandPtr m_ptrCommand; //命令对象_RecordsetPtr m_ptrRecordset; //记录集对象_ConnectionPtr m_ptrConnection; //数据库对象CString m_strConnect, //连接字符串m_strErrorMsg; //错误信息public:CDBAdo(void); ~CDBAdo(void); void DetectResult(HRESULT hResult); void RecordErrorMsg(_com_error comError); CString GetLastError(){return m_strErrorMsg;} bool CreateInstance(); bool SetConnectionString(CString strDriver, CString strIP, WORD wPort, CString strCatalog, CString strUserID, CString strPassword); bool SetConnectionString(CString strDriver, CString strDataSrc, CString strPassword); bool OpenConnection();bool CloseConnection(); bool IsConnecting(); void ClearAllParameters(); voidAddParamter(LPCTSTR lpcsrName,ADOWE::ParameterDirectionEnum Direction,ADOWE::DataTypeEnum Type, long lSize, _variant_t & vtValue); void SetSPName(LPCTSTR lpcsrSPName); bool ExecuteCommand(bool bIsRecordset); bool Execute(LPCTSTR lpcsrCommand); long GetReturnValue(); bool OpenRecordset(char*szSQL); bool CloseRecordset(); bool IsRecordsetOpened(); bool IsEndRecordset(); void MoveToNext(); void MoveToFirst(); void MoveToLast(); long GetRecordCount(); bool GetFieldValue(LPCTSTR lpcsrFieldName, WORD& wValue); boolGetFieldValue(LPCTSTR lpcsrFieldName, CString& strValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, INT& nValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, BYTE& bValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, LONG& lValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, DWORD& dwValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, UINT& ulValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, DOUBLE& dbValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, __int64& llValue); bool GetFieldValue(LPCTSTR lpcsrFieldName, COleDateTime& Time); boolGetFieldValue(LPCTSTR lpcsrFieldName, bool& bValue); }; 实现文件[cpp] view plaincopy#include"StdAfx.h" #include "DBAdo.h"CDBAdo::CDBAdo(void) { m_strConnect =_T(""); m_strErrorMsg = _T(""); //初始化COM CoInitialize(NULL); }CDBAdo::~CDBAdo(void) { //关闭连接CloseConnection(); //释放对象if(m_ptrCommand!=NULL)m_ptrCommand.Release(); if(m_ptrRecordset!=NULL) m_ptrRecordset.Release(); if(m_ptrConnection!=NULL) m_ptrConnection.Release(); } boolCDBAdo::CreateInstance() { //创建对象m_ptrCommand.CreateInstance(__uuidof(Command));m_ptrRecordset.CreateInstance(__uuidof(Recordset));m_ptrConnection.CreateInstance(__uuidof(Connection));if(m_ptrCommand==NULL){ m_strErrorMsg = _T("数据库命令对象创建失败"); return false; }if(m_ptrRecordset==NULL){ m_strErrorMsg = _T("数据库记录集对象创建失败"); return false; }if(m_ptrConnection==NULL){ m_strErrorMsg = _T("数据库连接对象创建失败"); return false; } //设置变量m_ptrCommand->CommandType = adCmdStoredProc; return true; } void CDBAdo::DetectResult(HRESULT hResult) { if(FAILED(hResult))_com_issue_error(hResult); } voidCDBAdo::RecordErrorMsg(_com_error comError){ _bstr_t bstrDescribe(comError.Description());m_strErrorMsg.Format(TEXT("ADO 错误:0x%8x,%s"), comError.Error(), (LPCTSTR)bstrDescribe); } bool CDBAdo::SetConnectionString(CString strDriver, CString strIP, WORD wPort, CString strCatalog, CString strUserID, CString strPassword) { CString strProvider, strPWD, strUID, strData, strDataSrc;strProvider.Format(_T("Provider=%s;"), strProvider); strPWD.Format(_T("Password=%s;"), strPassword);strUID.Format(_T("User ID=%s;"), strUserID);strData.Format(_T("Initial Catalog=%s;"), strCatalog); strDataSrc.Format(_T("Data Source=%s,%ld;"), strIP, wPort); //构造连接字符串m_strConnect =strProvider+strPWD+_T("Persist SecurityInfo=True;")+strUID+strData+strDataSrc; return true; } bool CDBAdo::SetConnectionString(CStringstrDriver, CString strDataSrc, CString strPassword){ CString strProvider, strDataSource, strPWD; strProvider.Format(_T("Provider=%s;"), strDriver); strDataSource.Format(_T("Data Source=%s;"), strDataSrc); strPWD.Format(_T("Jet OLEDB:DataBase Password=%s;"), strPassword); //构造连接字符串m_strConnect = strProvider+_T("User ID=Admin;")+strDataSource+strPWD; return true; } bool CDBAdo::OpenConnection(){ try { //关闭连接CloseConnection(); //连接数据库DetectResult(m_ptrConnection->Open(_bstr_t(m_strConnect ), "", "", adModeUnknown));m_ptrConnection->CursorLocation = adUseClient;m_ptrCommand->ActiveConnection = m_ptrConnection; return true; } catch(_com_error& comError) { RecordErrorMsg(comError); }return false; } bool CDBAdo::CloseConnection(){ try { CloseRecordset();if((m_ptrConnection!=NULL)&&(m_ptrConnection->GetState()!=adStateClosed))DetectResult(m_ptrConnection->Close());return true; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::IsConnecting(){ try { //状态判断if(m_ptrConnection==NULL) return false; if(m_ptrConnection->GetState()==adStateClosed)return false; //参数判断long lErrorCount = m_ptrConnection->Errors->Count;if(lErrorCount>0L) { ErrorPtr pError = NULL; for(long i=0;i<lErrorCount; i++){ pError =m_ptrConnection->Errors->GetItem(i);if(pError->Number==0x80004005)return false; } }return true; } catch(_com_error& comError) { RecordErrorMsg(comError); }return false; } bool CDBAdo::OpenRecordset(char* szSQL) { try { //关闭记录集CloseRecordset();m_ptrRecordset->Open(szSQL,m_ptrConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); returntrue; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::CloseRecordset(){ try { if(IsRecordsetOpened()) DetectResult(m_ptrRecordset->Close()); return true; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::IsRecordsetOpened(){ if(m_ptrRecordset==NULL) return false; if(m_ptrRecordset->GetState()==adStateClosed)return false; return true; } bool CDBAdo::IsEndRecordset() { try{ return(m_ptrRecordset->EndOfFile==V ARIANT_TRUE); } catch(_com_error& comError){ RecordErrorMsg(comError); }return true; } void CDBAdo::MoveToNext() { try { m_ptrRecordset->MoveNext(); } catch(_com_error& comError){ RecordErrorMsg(comError); } } void CDBAdo::MoveToFirst() { try{ m_ptrRecordset->MoveFirst(); }catch(_com_error& comError){ RecordErrorMsg(comError); } } void CDBAdo::MoveToLast() { try{ m_ptrRecordset->MoveLast(); } catch(_com_error& comError){ RecordErrorMsg(comError); } } long CDBAdo::GetRecordCount() { try{ if(m_ptrRecordset==NULL)return 0; returnm_ptrRecordset->GetRecordCount(); }catch(_com_error& comError){ RecordErrorMsg(comError); }return 0; } void CDBAdo::ClearAllParameters(){ try { long lParamCount =m_ptrCommand->Parameters->Count;if(lParamCount>0L) { for(long i=lParamCount; i>0; i--){ _variant_t vtIndex;vtIndex.intVal = i-1;m_ptrCommand->Parameters->Delete(vtIndex);} } } catch(_com_error& comError){ RecordErrorMsg(comError); } } void CDBAdo::AddParamter(LPCTSTR lpcsrName, ADOWE::ParameterDirectionEnum Direction,ADOWE::DataTypeEnum Type, long lSize, _variant_t & vtValue) { ASSERT(lpcsrName!=NULL); try { _ParameterPtr Parameter =m_ptrCommand->CreateParameter(lpcsrName, Type, Direction, lSize, vtValue);m_ptrCommand->Parameters->Append(Parameter);} catch(_com_error& comError){ RecordErrorMsg(comError); } } void CDBAdo::SetSPName(LPCTSTR lpcsrSPName) { try { m_ptrCommand->CommandText = lpcsrSPName; } catch(_com_error& comError){ RecordErrorMsg(comError); } } bool CDBAdo::ExecuteCommand(bool bIsRecordset) { try { //关闭记录集CloseRecordset();//执行命令if(bIsRecordset){ m_ptrRecordset->PutRefSource(m_ptrCo mmand); m_ptrRecordset->CursorLocation = adUseClient;DetectResult(m_ptrRecordset->Open((IDispatch*)m_ptrCom mand, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified)); }else{ m_ptrConnection->CursorLocation = adUseClient;DetectResult(m_ptrCommand->Execute(NULL, NULL, adExecuteNoRecords)); } returntrue; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::Execute(LPCTSTR lpcsrCommand) { try{ m_ptrConnection->CursorLocation = adUseClient;m_ptrConnection->Execute(lpcsrCommand, NULL, adExecuteNoRecords); return true; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } long CDBAdo::GetReturnValue(){ try { _ParameterPtr ptrParam; long lParameterCount =m_ptrCommand->Parameters->Count;for(long i=0; i<lParameterCount; i++){ ptrParam =m_ptrCommand->Parameters->Item[i];if(ptrParam->Direction==adParamReturnValue)return ptrParam->Value.lVal; } }catch(_com_error& comError){ RecordErrorMsg(comError); }return 0; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, WORD& wValue) { wValue = 0L; try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value;if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) wValue = (WORD)vtFld.ulVal; returntrue; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, CString& strValue) { try{ _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value; if(vtFld.vt==VT_BSTR){ strValue = (char*)_bstr_t(vtFld); strValue.TrimLeft(); return true; }return false; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, INT& nValue) { nValue = 0; try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value; switch(vtFld.vt){ case VT_BOOL:{ nValue = vtFld.boolVal;break; } case VT_I2:case VT_UI1: { nValue = vtFld.iVal; break; } case VT_NULL: case VT_EMPTY:{ nValue = 0;break; } default: nValue =vtFld.iVal; } return true; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, BYTE& bValue) { bValue = 0; try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value; switch(vtFld.vt){ case VT_BOOL:{ bValue = (vtFld.boolVal!=0)?1:0; break; } case VT_I2:case VT_UI1: { bValue = (vtFld.iVal>0)?1:0;break; } case VT_NULL:case VT_EMPTY:{ bValue = 0;break; } default: bValue = (BYTE)vtFld.iVal; } returntrue; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, UINT& ulValue) { ulValue = 0L; try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value;if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue = vtFld.lVal; return true; }catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, DOUBLE& dbValue){ dbValue=0.0L; try{ _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value; switch(vtFld.vt){ case VT_R4:dbValue = vtFld.fltVal;break;case VT_R8:dbValue = vtFld.dblVal;break; case VT_DECIMAL:{ dbValue = vtFld.decVal.Lo32; dbValue *= (vtFld.decVal.sign==128)?-1:1;dbValue /= pow((float)10,vtFld.decVal.scale); } break; case VT_UI1:dbValue = vtFld.iVal;break; case VT_I2: case VT_I4:dbValue =vtFld.lVal;break; case VT_NULL: case VT_EMPTY:dbValue = 0.0L;break;default:dbValue = vtFld.dblVal; } return true; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, LONG& lValue) { lValue = 0L;try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value;if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) lValue = vtFld.lVal; return true; }catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, DWORD& dwValue) { dwValue = 0L; try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value;if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) dwValue = vtFld.ulVal; return true; }catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, __int64& llValue) { llValue = 0L; try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value;if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY))llValue=vtFld.lVal; return true; }catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, COleDateTime& Time) { try { _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value; switch(vtFld.vt){ case VT_DATE:{ COleDateTime TempTime(vtFld); Time = TempTime; }break;case VT_EMPTY: caseVT_NULL:Time.SetStatus(COleDateTime::null);break; default: return false; } returntrue; } catch(_com_error& comError){ RecordErrorMsg(comError); }return false; } bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, bool& bValue) { try{ _variant_t vtFld =m_ptrRecordset->Fields->GetItem(lpcsrFieldName)-> Value; switch(vtFld.vt){ caseVT_BOOL:bValue=(vtFld.boolVal==0)?false:true;break;case VT_EMPTY: case VT_NULL:bValue = false;break; default:return false; }return true; } catch(_com_error& comError) { RecordErrorMsg(comError); }return false; }。
第9章C#使用ADO进行数据库编程
9.1.2 数据库设计
▪ ers(用户表) ▪ 表users用于保存系统所有的用户信息
9.1.2 数据库设计
▪ 3.scores(电影评价表) ▪ 表scores用于保存系统所有的评价信息
9.2 窗体设计部分
❖整个FSS项目, 划分成主要的6个任务来完成, 首先 是窗体的设计, 然后是各个窗体代码的完成。
9.2 窗体设计部分
❖任务9.1 任务实施
▪ (一)在Visual Studio中建立Winform项目
• (1) 设置Visual Studio的开发语言环境
9.2 窗体设计部分
❖任务9.1 任务实施 ❖(一)在Visual Studio中建立Winform项目 ❖(2) 新建FSS项目 ❖选择【文件】|【新建】|【项目】命令, 打开“新
9模块
• (2) 图片的插入
9.2 窗体设计部分
❖任务9.1 任务实施
▪ (二)系统登录窗体模块
• (3) 添加其他控件
– 该窗体用到的主要控件如表9-6所示。
9.2 窗体设计部分
❖任务9.1 任务实施 ❖ (三)“导航”窗体模块 ❖(1) “导航”模块概述 ❖“导航”窗体, 也就是相当于系统的主窗体, 通过
“搜电影”一栏的文本框中输入的关键字, 在数据 库的“电影介绍表”中搜索, 电影名称含有该关键 字的电影, 并显示在窗体对应的控件中, “搜索电 影”窗体界面布局如图9-15所示。
9.2 窗体设计部分
❖任务9.1 任务实施 ❖ (四)“搜索电影”窗体模块 ❖(2) 窗体的分区 ❖从前面两个窗体可以看出, 我们系统的窗体中都有
9.2 窗体设计部分
❖任务9.1 任务实施
▪ (六)“推荐电影”窗体模块
实验课ADO编程共35页
18
ADO接口使用——连接数据库(2)
使用Connction对象的Open方法连接数据库,原型:
连接用户名 连接密码
在DeleteItem中,获取当前list中选中的条目,在全局 记录集中删除对应的条目,更新记录集
这里有一个bug:当list显示的是查找结果时,会错 删。解决方法:在view类中定义一个“查找结果” 记录集对象。并判断当前显示的是查找结果记录集 还是全局记录集。
12
Step10:Find
定义查询的SQL语句 定义查询记录集对象 调用connection对象的execute方法,查询结果,返回
针到第一条 遍历记录集,读取每条数据,显示在list中
10
Step8:Add按钮
检查数据库状态 检查控件输入是否完整,用“NULL”将不完整部分
补足 向当前记录集中添加一条记录。 调用update方法,将记录集更新到数据库
11
Step9:删除记录
在PreTranslateMessage中,响应按纽事件,判断:如 果按钮为del键,并且当前listctrl控件为“焦点控 件”,则调用deleteitem
实验课ADO编程
怎样思想,就有怎样的生活
北京语言大学信息科学学院
Windows 程序设计
实验:ADO接口编程
于东 2012上,第十四周
实验课:使用ADO接口编程
目标: 实现W14_1_ADO程序,使用ADO接口对Access数据
库编程。完成后,尝试使用ODBC连接SQL数据库。
在ADO数据库中读写位图数据
高三物理知识点详细解析高三物理是高中物理学习的最后阶段,这一阶段的物理学习既是对前面知识的巩固,又是为大学物理学习打下基础。
本文将对高三物理的知识点进行详细解析,帮助同学们更好地理解和掌握高三物理知识。
一、力学1.1 牛顿运动定律高三物理力学部分首先是对牛顿运动定律的复习和深化。
牛顿运动定律包括:•第一定律:一个物体若受外力为零,则物体静止或匀速直线运动。
•第二定律:物体受外力F,加速度a与外力成正比,与物体质量m 成反比,即F=ma。
•第三定律:物体间的相互作用力大小相等、方向相反。
1.2 动量定理动量定理是指物体动量的改变等于作用在物体上的外力的冲量。
动量定理的表达式为:Δp=FΔt,其中Δp表示动量的改变,F表示作用在物体上的外力,Δt表示作用时间。
1.3 能量守恒定律能量守恒定律是指在一个封闭系统中,能量不会凭空产生也不会凭空消失,能量的总量保持不变。
能量守恒定律可以表述为:系统的初始能量等于系统的末状态能量。
二、热学2.1 温度、热量与内能温度是表示物体冷热程度的物理量,热量是热能的传递,内能是物体分子运动的动能和分子间相互作用的势能之和。
2.2 热力学第一定律热力学第一定律是能量守恒定律在热现象中的体现,表述为:系统内部的能量变化等于外界对系统做的功加上系统吸收的热量。
2.3 热力学第二定律热力学第二定律是指在一个封闭系统中,热量自发地从高温部分传递到低温部分,而不会自发地从低温部分传递到高温部分。
三、电学3.1 库仑定律库仑定律是指两个点电荷之间的电力与两点电荷的电荷量成正比,与两电荷之间的距离的平方成反比。
3.2 欧姆定律欧姆定律是指在电路中,电流I与电压U成正比,与电阻R成反比,即I=U/R。
3.3 麦克斯韦方程组麦克斯韦方程组是描述电磁场的基本方程,包括高斯定律、法拉第感应定律、安培环路定律和无源电场的高斯定律。
四、光学4.1 光的传播光在真空中的传播速度为常数,即光速c=3×10^8 m/s。
使用ADO操作数据库.ppt
将CommandText作为存储过程名进行计 算。 RecordSouce为存储过程
4、RecordSource属性
取R值ec随ordCSoomurmcea属n性dT设yp定e:属性值的不同而不同:
5、Mode 属性设置值
删除数据: create procedure s5_delete (@a char(6),@b nchar(8),@c char(2))
as delete s5 where sno=@a and sname=@b and ssex=@c 执行:exec s5_insert '95001','李勇','女'
ADO接口:是为Microsoft最新和最强大 的数据访问范例OLE DB而设计的,是一 个便于使用的应用接口。
OLE DB为任何数据源提供了高性能的访 问,这些数据源包括关系和非关系型数 据库、电子邮件和文件系统、文本和图 形、自定义业务对象等
使用ADO访问数据源,我们可以将数据 保存到recordset对象中,然后用update 进行更新,还可以用command对象执行 SQL 数据更新。使用ADO访问都需要3个 步骤:首先是建立数据源连接(即创建 connection对象)然后是检索数据(创建 recordset对象)和操作数据。
Mode属性值
含义
Ad Mode Unknown
默认,没设置或不确定权限
Ad ModeRead
具有只读权限
Ad ModeWrite
具有只写权限
Ad ModeReadWrite
具有读/写权限
Ad ModeShareDenyRead 禁止具有读权限的其他人操作数据库
ADO数据库编程应用
打开一个连接。 Open Schema 从 provider 返回有关数据源的 schema 信息。 RollbackTrans 取消当前事务中所作的任何更改并结束事务。
13
3 基于ADO的软件开发(5/13)
•
3.3 Connection对象(事件) 事件 描述 在 BeginTrans 操作之后被触发。 在 CommitTrans 操作之后被触发。 在一个连接开始后被触发。 在一个连接结束之后被触发。 在一条命令执行完毕后被触发。 假如在一个 ConnectionEvent 操作过程中警 告发生,则触发该事件。 在 RollbackTrans 操作之后被触发。 在一个连接开始之前被触发。 在一条命令被执行之前被触发。
•
这些技术各有自己的特点
4
1 概述 (3/5)
•
ODBC(Open DataBase Connectivity, 开放数据库互联)
– 20世纪80年代末90年代初出现的技术 – 向程序员提供了统一的编程接口 – 只能访问关系型数据库
客户程序 ODBC驱动 程序管理器 ODBC 驱动程序 关系型 数据库
•
早期的厂商在推出数据库产品,相应的会为程序员提供一套针 对该数据库的访问接口,不同的厂商提供不同的接口,这样就 加大了s平台下推出了一些标准的数据库访 问技术。(大有一统数据库接口的“野心”)
3
1 概述 (2/5)
•
微软推出的标准数据库访问技术
17
属性
AbsolutePage AbsolutePosition ActiveCommand ActiveConnection BOF Bookmark CacheSize CursorLocation CursorType DataMember DataSource
用ADO的COMMAND对象实现对WEB数据库动态数据查询的方法
用ADO的COMMAND对象实现对WEB数据库动态数据查询的方法用ADO 的COMMAND对象实现对WEB数据库动态数据查询的方法★林碧英众所周知,由于ASP技术的出现,使得Intranet的应用更加广泛深入。
相当多的企业都建立了企业内部综合查询系统,如何快速、准确地查询企业内部信息是编写基于WEB技术应用程序必须要解决的主要问题。
ASP提供了用ADO内置的3个主要对象Recordset、Connection和Command对WEB数据库进行操作。
其中Connection的主要功能是建立与WEB数据库的链接;Command的主要功能是向WEB数据库传送数据查询的请求;Recordset的主要功能是建立数据查询的结果集。
由于ADO几乎就是为WEB数据库应用量身定做的,所以其中的Command对象在数据查询方面具有强大的功能。
它不仅能够将一般的SQL指令送往WEB数据库服务器,还能够传送带有参数的SQL指令,更重要的是还可以传送存储过程,因而能够开发出更具效率的数据库网页。
一、command对象的主要属性和方法为了进一步阐述Command对象的数据查询功能,有必要先介绍一下Command 对象的与数据查询密切相关的一些属性和方法。
属性: (1CommandText:指定数据查询信息。
可以是SQL语句、存储过程。
(2CommandType:指定数据查询的类型。
可以取四种设定值。
(3)ActiveConnection:建立与Connection通道的链接关系。
方法: (1Createparameter:建立一个新的参数对象。
(2Execute:对数据库提出数据查询。
Command对象可以用Createparameter方法建立新的参数对象,再用parameters对象的append方法将新的参数对象增加到parameters数据集合里。
执行结果是:建立一个参数名为合同编号,数据类型为字符型,长度为10,参数允许的读写模式为输入,参数值为“1000030005”的参数对象,然后将此参数加入parameters数据集合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ADO(Active Data Object) 是微软公司基于OLE DB的数据库模型。
它实现了一系列COM 接口,通过数据提供者(Data Provider)和数据使用者( Data Consumer)来实现广义的数据存取。
ADO模型一方面简化了数据存取,例如使用Jet OLE DB Provider可以实现Access 数据库的无DSN连接;另一方面,在ASP等Internet应用中也得到了广泛的使用。
在C++Builder 5/Delphi 5中诸多新增特性中,ADO数据控件的引入是比较引人注目的,它使ADO编程和在Visual Basic 6中一样容易。
由于VCL类库对ADO的封装更加合理,旧的数据控件可以很容易地升级到ADO支持,而不象在VB中某些DAO或RDO控件无法兼容ADO。
在C++Builder 5中,ADO控件实质上是一种数据访问组件。
如果读者有过C++Builder先前版本的数据库开发经验,就会发现与数据访问组件相连的数据源组件(TdataSource) 和数据感知组件(如TDBGrid)的使用方法和以前一样,只需把 TdataSource 连到ADO控件上即可。
如果要实现简单的表操作或查询,可以使用TADOTable或TADOQuery。
更一般地,可以使用TADODataSet控件,其基本属性的设置方法如下:(1)ConnectionString属性:点击属性栏中的省略号,出现配置窗口,选"Use Connection String",按Build按钮。
在接下来的窗口中选择数据提供者,以微软的Northwind示例Access数据库为例,选Microsoft Jet 4.0 OLE DB Provider, 按Next按钮,选择数据库的路径和文件名。
点击Test Connection 按钮可以测试数据库连接。
点击"确定"。
(2)CommandText属性:可以使用CommandText Editor 生成SQL语句或Shape语句。
注意,TADODataSet不支持不返回结果集的DML语句,如DELETE,INSERT,UPDATE。
如果要使用这些语句,选择TADOCommand或TADOQuery。
这些ADO控件自身已能实现数据库连接,也可以设置其Connection属性为一个TADOConnection控件名,而在 TADOConnection控件中设置 ConnectionString属性。
所有属性也可以用代码在运行期间设置。
下面以一个简单的实例说明ADO控件的应用。
这里我们用Shape语句实现
Master/Detail关系。
关于Shape语句的详细解释,请参考MSDN文档。
1. 新建一个项目,并在窗体中放置下列控件(带省略号的属性值先不设置):
名称控件类型属性属性值
ADOConnection1 TADOConnection ConnectionString …
ADODataSet1 TADODataSet Connection ADOCon nection1 CommandText…
DataSource1 TDataSource DataSet ADODataSet1
DBGrid1 TDBGrid DataSource DataSource1
ADODataSet2 TADODataSet DataSetField …
DataSource2 TDataSource DataSet ADODataSet2
DBGrid2 TDBGrid DataSource DataSource2
2. 设置 ADOConnection1的ConnectionString值
选择Data Provider为MSDataShape,并设置Northwind数据库的路径和名称。
3. 设置 ADODataSet1的CommandText值如下:
SHAPE {select * from Orders}
APPEND ({select * from [Order Details]} AS Details
RELATE OrderID TO OrderID)
这里定义了主表Orders和子表Order Details通过OrderID的连接。
4. 在ADODataSet1控件上右击,选Fields Editor…->右击->选Add fields… 或Add all fields,务必选中"Details"项,这是我们在Shape语句中定义的用于子表连接主表的数据集。
5. 设置
ADODataSet2的DataSetField值,这时可供选择的值为ADODataSet1Details,选中它,表明与ADODataSet1的Details列相连。
6. 出现在 DBGrid1中的 Details 列,其每个记录都是DataSet类型的。
可以在DBGrid1中隐藏 Details列的显示:选择 DBGrid1的Columns属性,在弹出窗口的工具条上点击 Add all Fields,选中 Details,点击Delete Selected.
7. 运行该程序,当数据指针在主表Orders中移动时,子表Order Details自动更新以显示不同订单的明细条目。
从以上实例看出, C++Builder 5完全具备开发复杂的ADO应用程序的能力,其强大的VCL控件使开发者能集中注意力于数据库的逻辑与功能设计,而不必关心繁复的常规代码和操作。