VC++通过ADO连接数据库(一)

VC++中使用MFC通过ADO连接数据库 VC++中使用MFC通过ADO连接数据库 一.让我们看看ADO数据库访问技术使用的基本步骤及方法:     1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用 #import引用它既可。可以直接在Stdafx.h 阅读详情

有关数据库的开发做的很少,以前都只是算法类的程序编写,现在对在VC++中连接sqlserver数据库的方法做个总结,以备以后查阅


首先,在stdafx.h头文件中添加以下语句
#import "C:\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")
导入ado库,no_namespace表示无命名空间,rename("EOF","adoEOF")表示重命名eof  为 adoefo  避免和其他的常量冲突

接着,在MFC中可以用AfxOleInit();非MFC环境中用:
CoInitialize(NULL);
CoUnInitialize();

一般MFC程序中都是默认初始化Com口的。


然后,创建ADO连接数据库的智能指针,下面将分别讲述如何利用_ConnectionPtr和_CommandPtr以及_RecordsetPtr连接数据库的方法

1.利用_ConnectionPtr连接和操作数据库

_ConnectionPtr pConnectionPtr;
	//连接字串,连接Sqlserver
	CString strConnection = "Provider=SQLOLEDB;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=ImageDB;Data Source=.\\SQLEXPRESS";
	pConnectionPtr.CreateInstance("ADODB.Connection");
	HRESULT hr=pConnectionPtr->Open(_bstr_t(strConnection),"","",adConnectUnspecified);
	if (FAILED(hr))
	{
		pConnectionPtr.Release();
		return;
	}
	CString strSql = "insert into StudentInfo values('wang',22,'boy')";
	COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
	pConnectionPtr->Execute(_bstr_t(strSql),vtOptional,-1);
	pConnectionPtr->Close();
	pConnectionPtr.Release();


_ConnectionPtr返回一个记录集或空指针,通常使用它来创建数据库连接和执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr返回一个记录集不是一个好的使用方法,对于要返回记录的操作,通常用_RecordsetPtr来实现,使用_ConnectionPtr来操作时想要得到记录的条数得遍历所有的记录,而用_RecordsetPtr时不需要

2.利用_CommandPtr来连接和操作数据库

_CommandPtr pCommandPtr;
	pCommandPtr.CreateInstance("ADODB.Command");
	pCommandPtr->ActiveConnection = pConnectionPtr;
	pCommandPtr->CommandText = "insert into StudentInfo values('wang',22,'boy')";
	pCommandPtr->Execute(NULL,NULL,adCmdText);
	pCommandPtr->CommandText = "select * from StudentInfo";
	_RecordsetPtr pRecordsetPtr = pCommandPtr->Execute(NULL,NULL,adCmdText);
	_variant_t vName = pRecordsetPtr->GetCollect((_variant_t)(long)0);//取得第一个字段
	CString sName = (LPCTSTR)_bstr_t(vName);
	pCommandPtr.Release();
	pRecordsetPtr->Close();
_CommandPtr返回一个记录集。

它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。

在使用_CommandPtr接口时,你可以使用全局的_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接字串。

如果你执行一次或几次数据库操作,使用连接字串是比较好的选择。

如果你要频繁访问数据库,并返回很多记录集,那么使用全局的_ConnectionPtr是个比较好的选择。

3.利用_RecordsetPtr连接和操作数据库

_RecordsetPtr pRecordsetPtr;
	pRecordsetPtr.CreateInstance("ADODB.Recordset");
	CString strConnection = "Provider=SQLOLEDB;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=ImageDB;Data Source=.\\SQLEXPRESS";
	CString strSQL = "select name,age,sex from StudentInfo";
	if (FAILED(pRecordsetPtr->Open(_variant_t(strSQL),_variant_t(strConnection),adOpenStatic,adLockOptimistic,adCmdText)))
	{
		pRecordsetPtr->Close();
		return FALSE;
	}
	while(!pRecordsetPtr->GetadoEOF())
	{
		_variant_t VarName;
		_variant_t VarAge;
		_variant_t VarSex;

		VarName = pRecordsetPtr->GetCollect("Name");
		VarAge = pRecordsetPtr->GetCollect("Age");
		VarSex = pRecordsetPtr->GetCollect("Sex");

		CString sName = (char *)_bstr_t(VarName);
		CString sAge  = (char *)_bstr_t(VarAge);
		CString sSex  = (char *)_bstr_t(VarSex);

		pRecordsetPtr->MoveNext();
	}
	pRecordsetPtr->Close();
	pRecordsetPtr.Release();

与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。
同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,
可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,
让它自己创建数据连接。
如果你要使用多个记录集,
最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,
然后使用_RecordsetPtr执行存储过程和SQL语句。

下面给出一个完整点的例子,作用是保存本地的bmp图片到数据库中

CFile file;
	int iLen;
	if( !file.Open( "Test.bmp", CFile::modeRead) )
		return ;
	iLen = (DWORD)file.GetLength();
	char* pBMPContent = new char[iLen + 1];
	if(!pBMPContent)
		return ;
	if(file.Read(pBMPContent,iLen) != iLen)
		return ;
	//保存到数据库
	_ConnectionPtr pConnectionPtr;
	_RecordsetPtr pRecordsetPtr;
	_CommandPtr pCommandPtr;
	try
	{
		CString strConnection = "Provider=SQLOLEDB;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=ImageDB;Data Source=.\\SQLEXPRESS";
		pConnectionPtr.CreateInstance("ADODB.Connection");
		pConnectionPtr->Open(_bstr_t(strConnection),"","",adConnectUnspecified);
		pRecordsetPtr.CreateInstance(__uuidof(Recordset));
		//+--------------------------------------------------------------+
		//+ 利用Command执行SQL语句,判断当前项目是否已存在图,若存在则删除
		//+ 在项目中修改图时会出现这种情况
		char *lpszRetValue = (char *)malloc(sizeof(char)*255);
		pCommandPtr.CreateInstance(__uuidof(Command));
		pCommandPtr->CommandTimeout = 30;
		pCommandPtr->ActiveConnection = pConnectionPtr;
		sprintf_s(lpszRetValue,254,"select Count(*) RstCount from ImageTable where ProjectName = '%s' and ExperimentName = '%s'",m_sProjectName,m_sExperimentName);
		pCommandPtr->CommandText = lpszRetValue;
		pRecordsetPtr = pCommandPtr->Execute(NULL,NULL,adCmdText);
		_variant_t vtValue;
		vtValue = pRecordsetPtr->GetCollect("RstCount");
		if (NULL != vtValue.vt)
		{
			strncpy((char*)lpszRetValue,LPCSTR(_bstr_t(vtValue)),255);
		}
		int iRstCount = atoi(lpszRetValue);
		free(lpszRetValue);
		if (iRstCount != 0)
		{
			sprintf_s(lpszRetValue,254,"delete from ImageTable where ProjectName = '%s' and ExperimentName = '%s'",m_sProjectName,m_sExperimentName);
			pCommandPtr->CommandText = lpszRetValue;
			pCommandPtr->Execute(NULL,NULL,adCmdText);
		}
		pRecordsetPtr->Close();
		//+--------------------------------------------------------------+
		HRESULT hr = pRecordsetPtr->Open("select * from ImageTable",_variant_t(pConnectionPtr,true),adOpenDynamic,adLockPessimistic,adCmdText);
		pRecordsetPtr->AddNew();

		SYSTEMTIME st;
		CString sSaveTime;
		GetLocalTime(&st);
		sSaveTime.Format("%4d-%02d-%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);

		pRecordsetPtr->PutCollect("SaveTime",_variant_t(sSaveTime));
		pRecordsetPtr->PutCollect("ProjectName",_variant_t(m_sProjectName));
		pRecordsetPtr->PutCollect("ExperimentName",_variant_t(m_sExperimentName));
		VARIANT varBLOB;
		SAFEARRAY *psa;
		SAFEARRAYBOUND rgsabound[1];
		rgsabound->lLbound = 0;
		rgsabound->cElements = iLen;
		psa = SafeArrayCreate(VT_UI1,1,rgsabound);
		for (long i=0;i<(long)iLen;i++)
		{
			SafeArrayPutElement (psa, &i, pBMPContent++);
		}
		varBLOB.vt = VT_ARRAY | VT_UI1;
		varBLOB.parray = psa;
		pRecordsetPtr->GetFields()->GetItem("Information")->AppendChunk(varBLOB);
		pRecordsetPtr->Update();
	}
	catch (_com_error  e)
	{
		dump_com_error(e);
	}
	if (pConnectionPtr->State)
	{
		pConnectionPtr->Close();
		pConnectionPtr.Release();
	}
	if (pRecordsetPtr->State)
	{
		pRecordsetPtr->Close();
		pRecordsetPtr = NULL;
	}


VC++ ADO数据库 FlexGrid控件 耗费了一下午,研究了一下VC的数据库编程,写了这个测试程序。主要的功能为实现access数据库的添加与删除,同时动态的将数据库数据显示在flexgrid控件中。下面把过程记录下来,以备后用。一。ADO简介 ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且 阅读详情

相关推荐

VC连接Oracle数据库之ODBC及ADO

一.ODBC连ORACLE:  str.Format( "Driver={Microsoft  ODBC  for  Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd; ") 二.ADO连接ORACLE:

薛定谔的喵 3086

vc 连接sqlserver数据库

1. 生成应用程序框架并初始化OLE/COM库环境   创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。 本例为:  BOOL CAdotestDlg::OnInitDialog()  { ::CoInitialize(NULL); //初始化

orange_xxx的专栏 2329

在VC++中使用ADO连接Oracle数据库的实现

ADO是微软提供的一个数据访问技术,它可以作为OLE DB的接口,让编程人员能够通过编程语言如C++, VB等,实现对数据库的访问。ADO以一种称为COM (Component Object Model) 的技术为基础,它封装了OLE DB提供的接口,使得数据库操作更为简单和直观。ADO库被设计为轻量级的、面向对象的接口,主要通过一组称为ADO对象的组件来提供对数据的访问。这些对象包括:ConnectionCommandRecordsetRecordError和Property等。

weixin_33670640的博客 1096

VC++连接数据库SQL2000应用实例及登陆退出

<br />我自己做了个用SQL2000联接的例子,请大家帮我看看,有什么不足还望指教。如能得到您的点滴指点<br />都将万分感谢。<br />这个例子现在只能操作一张表,要想操作整个库也不难,就是改SQL语句,然后配好数据库,建议使用存储过程<br />正文:<br />简易数据库系统<br />第一部分:用ADO连接SQL Server 2000<br />1 在STDafx.h中加入动态连接库msado15.dll,并重命名EOF为adoEOF,加在该文件后面(蓝色#endif后面,要是编译时有错误

bujanbusan的专栏 1229

VC++中使用ADO进行Access数据库操作的实例教程

本文还有配套的精品资源,点击获取 简介:本教程详细介绍了如何在VC++中使用ADO技术连接并操作Access数据库。文中首先解释了ADO技术及其在VC++中的应用,随后通过源代码实例详细阐述了实现数据库连接、执行SQL命令以及处理结果集的步骤,最后强调了关闭数据库连接的重要性。通过学习本实例,读者将能够掌握VC++环境下进行数据库应用开发的基础知识。 1. ADO...

weixin_31459297的博客 1283

VC++6.0 ADO数据库访问模板详解

VC++6.0,即Visual C++ 6.0,是由微软公司开发的一个集成开发环境(IDE),专门用于C++语言的软件开发。它提供了一套全面的工具集,包括代码编辑器、编译器、调试器和项目管理工具等,使得开发人员可以高效地编写、编译、调试和发布应用程序。OLE DB(Object Linking and Embedding for Databases)是一种由微软公司提供的数据库应用程序接口(API),它能够从多种数据源中获取数据。

weixin_28949937的博客 746

VC++连接SQLServer

VC++连接SQLServer/**连接SQL*/void CMFCSQLDlg::OnButton3(){       // TODO: Add your control notification handler code here       _ConnectionPtr   m_pConnection;// 在应用程序的InitInstance函数里加入 

叮当小马的专栏 2342

VC++中使用ADO对MSSQL数据库操作的实战原码解析

本文还有配套的精品资源,点击获取 简介:在VC++中,ADO技术用于访问包括MSSQL在内的多种数据库。文章详细介绍了如何通过ADO实现对MSSQL数据库的基本操作,包括建立连接、执行SQL命令、处理结果集、参数化查询、事务处理、错误处理以及关闭连接,并提供了相应的编程代码实例。这些操作涵盖了数据库编程的核心概念,适合VC初学者学习和应用。 1. ADO技术在VC...

weixin_34162851的博客 1840

visual studio连接sql server数据库

sql server是关系数据库管理系统,专门用来查询、操作和管理数据库。visual studio和sql server连接后,可以读取数据库中的数据,还能对数据进行增删改查。比如,我们在visual studio中用C#语言开发一个学生信息管理软件,具体功能有读取学生信息、更改学生信息、删除学生信息、添加学生信息等,这些学生的信息就存储在sql server中,软件可以根据用户的操作读取和更改数据库中的信息。

sc_1313的博客 1万+

Visual C++ 中使用ADO连接SQL Server数据库的实践指南

在当今快节奏的技术领域中,数据库的集成和数据的即时访问已成为应用程序不可或缺的特性。VC++作为一款功能强大的编程语言,与ADO(ActiveX Data Objects)技术的结合,为开发人员提供了一种高效的方式来连接并操作SQL Server数据库。这种技术组合特别适合需要精细控制数据库操作的高级场景,如复杂的事务处理和数据集同步等。

weixin_42462474的博客 904

VC连接sql server数据库

>1.VC连接SQL Server数据库时,需要作哪些设置? ----------------------------------------------------- (1)初始化COM库,引入ADO库定义文件 (2)用Connection对象连接数据库 (3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。 (4)使用完毕后关闭连接释放对象。 >2.ADO、OLEDB、ODBC、DAO等几个数据库相关的词分别什么意思?有什么关系?

C++ ADO方式连接mysql数据库

对于软件开发其实说白了就是在不停地和数据打交道, 所以数据库的操作是必不可少的, 接下来介绍VC开发中利用ADO建立ODBC数据源来访问MySQL数据库.        从我接触的数据库编程方式来说, 我觉得在vc开发连接数据库是比较难的, 也是很容易出错. 在android中, 系统自带sqlite数据库,只需要使用SQLiteOpenHelper抽象类即可完成与数据库的操作. 在java中,

lbcab的博客 1万+

VC连接SQL Server数据库小例子

此例子是使用VC2010 连接SQL SERVER数据库的源代码,也可以稍作修改用来连接ORACLE/MYSQL等其他数据库,例子非常简单。只要有了解过的同学,一看就能明白,谢谢惠存

MFC或VC++中利用ADO连接数据库的步骤

1 事先初始化COM库 ::CoInitialize(NULL);   2:定义_ConnectionPtr 对象指针,通过m_pConnection.CreateInstance("ADODB.Connection");创建实例并通过Open()方法连接数据库     3  通过ConnectionPtr 对象的Execute方法执行sql语句(也可通过_CommandPtr对象)

zhangyulin54321的专栏 1万+

VC 利用ADO连接Sqlserver2005数据库示例

简单介绍VC使用ADO连接Sqlserver2005数据库的方法。参考VC++深入详解.pdf里面的示例(教程上的数据库对sqlserver2005不适用)。

vc++ADO连接sqlserver数据库增删改清除

vc++用ADO连接sqlserver数据库,无需创建ODBC数据源,实现数据的增删改清除

VC++ ADO 连接 mysql

VC++ ADO 连接 mysql

Welcom to zougangx's blog 2575

Ubuntu22.04安装ROS1

代表使用 2 线程进行编译,可以根据 CPU 适当调整。如果出现小乌龟窗口,说明安装成功 🎉!启动成功,则打开另一个终端,测试。需要解决一些兼容性问题,因为。由于 Ubuntu 22.04。过程,确保成功安装。

asafriend的博客 4647

VC++的ADO连接SQL Server步骤

 1:SQL  Server数据库配置     开启服务器   托盘显示服务器启动   2:在StaAfx.h 中添加如下代码 #import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace      rename("

LEEBIAO的专栏 1875

产品失效你必须要知道的概念---MTBF、MTTF和FIT

如果我们想知道该电路在10年后仍能正常工作的几率,按照前面例子的相同计算步骤,结果将是90.3%。例如,假设一个TDK电容器的MTBF为6918年(16.5失效时间间隔,FIT),这并不意味着该电容器能持续这么久(显然,没有人能够对部件进行这么长时间的测试)。综上,MTBF和MTTF是用来描述系统或设备级别的故障间隔时间,而FIT是用来描述某单一器件的失效率的单位。MTBF和MTTF使用相同的计算方法,但MTBF用于可维修的产品,而MTTF用于不可维修或维修成本过高的产品。

weixin_49761275的博客 3834

SAM3 LoRA Fine-Tuning|SAM3微调(完全对齐官方训练和配置)

本文介绍了基于官方SAM3模型使用LoRA技术进行图像目标检测与分割微调的项目。项目完全对齐官方训练配置,支持多类别高效微调,且不影响原模型的开放词汇提示能力。微调后模型在航拍图像中对道路、车辆等目标的分割效果显著提升,误检率降低。 项目提供完整的训练和推理流程: 支持双卡并行训练,显存需求大(完整微调需30G+显存) 提供训练脚本和配置文件,可灵活调整参数 包含推理可视化工具,支持与原模型效果对比,内置训练结果分析工具,可生成指标对比图 数据集采用COCO格式。

weixin_46248968的博客 359
上一篇: sqlserver去除重复记录
下一篇: VC++ 通过ADO连接数据库(二)
wanglx2012
博客等级 码龄15年 32粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值