`

共享 C++连接数据库代码

阅读更多
嘿嘿,C++我也是学到了些基础,今天想做一个小工程,需要连接数据库类
Integrated Security=SSPI好像是windows身份验证吧,你之后的"User ID=sa;pwd=;"则是SQL Server身份验证,试一下去除"Integrated Security=SSPI 

VC++下使用ADO编写数据库程序

准备:
(1)、引入ADO类

#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")
(2)、初始化COM

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

(3)#import 包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr

1.连接和关闭数据库 (1)连接

例子:连接Access数据库
AfxOleInit();//初始化
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionTimeout = 0;
hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb", "", "", adModeUnknown);
//m_pConnection->PutDefaultDatabase ((_bstr_t)"DB");//设置默认数据库

m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->CommandTimeout = 5;
m_pCommand->ActiveConnection = m_pConnection;
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}


(2)、关闭

//如果数据库连接有效
if( m_pConnection->State )
m_pConnection->Close();
m_pConnection = NULL;

(3)、设置连接时间 //设置连接时间-----------------------------------
pConnection->put_ConnectionTimeout(long(5));
2.打开一个结果集

(1)打开,首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable",// 查询DemoTable表中所有字段
m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}

(2)关闭结果集 m_pRecordset->Close();

3.操作一个结果集

(1)、遍历(读取)
a)、用pRecordset->adoEOF来判断数据库指针是否已经移到结果集的末尾了;m_pRecordset->BOF判断是否 在第一条记录前面: while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}

b)、取得一个字段的值的办法有两种办法

一是

//表示取得第0个字段的值 m_pRecordset->GetCollect("Name");

或者 m_pRecordset->GetCollect(_variant_t(long(0));

二是
pRecordset->get_Collect("COLUMN_NAME");

或者 pRecordset->get_Collect(long(index));

(2)、添加

a)、调用m_pRecordset->AddNew();
b)、调用m_pRecordset->PutCollect();给每个字段赋值
c)、调用m_pRecordset->Update();确认

(3)、修改
(4)、删除
a)、把记录指针移动到要删除的记录上,然后调用Delete(adAffectCurrent) try
{
// 假设删除第二条记录
m_pRecordset->MoveFirst();
m_pRecordset->Move(1);
// 从0开始
m_pRecordset->Delete(adAffectCurrent);
// 参数adAffectCurrent为删除当前记录
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}

4.直接执行SQL语句,除了要用到结果集其余的大部分功能都可以直接用SQL语言实现

(1)、用_CommandPtr和_RecordsetPtr配合
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
// 将库连接赋于它
m_pCommand->ActiveConnection = m_pConnection;
// SQL语句
m_pCommand->CommandText = "SELECT * FROM DemoTable";
// 执行SQL语句,返回记录集
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText);
(2)、直接用_ConnectionPtr执行SQL语句
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText,
VARIANT * RecordsAffected,
long Options )

其中CommandText是命令字串,通常是SQL命令。
参数RecordsAffected是操作完成后所影响的行数,
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知

例子:
_variant_t RecordsAffected;
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
5.调用存储过程
(1)、利用_CommandPtr
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "Demo";
m_pCommand->Execute(NULL,NULL, adCmdStoredProc);
(2)、直接用_ConnectionPtr直接调用(见4.(2))

6.遍历数据库中的所有表名 _ConnectionPtr m_pConnect;
_RecordsetPtr pSet;
HRESULT hr;
try
{
hr = m_pConnect.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
CString dd;
dd.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",file);
hr = m_pConnect->Open((_bstr_t)dd,"","",adModeUnknown);
pSet = m_pConnect->OpenSchema(adSchemaTables);
while(!(pSet->adoEOF))
{
//获取表格
_bstr_t table_name = pSet->Fields->GetItem("TABLE_NAME")->Value;

//获取表格类型
_bstr_t table_type = pSet->Fields->GetItem("TABLE_TYPE")->Value;

//过滤一下,只输出表格名称,其他的省略
if ( strcmp(((LPCSTR)table_type),"TABLE")==0){
CString tt;
tt.Format("%s",(LPCSTR)table_name);
AfxMessageBox(tt);
}
pSet->MoveNext();
}
pSet->Close();
}
m_pConnect->Close();
}catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);
return -1;
}
7.遍历一个表中的所有字段
Field * field = NULL;
HRESULT hr;
Fields * fields = NULL;
hr = m_pRecordset->get_Fields (&fields); //得到记录集的字段集和

if(SUCCEEDED(hr))
fields->get_Count(&ColCount);

//得到记录集的字段集合中的字段的总个数
for(i=0;iItem[i]->get_Name(&bstrColName); //得到记录集//中的字段名
strColName=bstrColName;
nameField = strColName;
m_FieldsList.AddString(nameField);
}
if(SUCCEEDED(hr))
fields->Release();//释放指针

附:
1、_variant_t
(1)、一般传给这3个指针的值都不是MFC直接支持的数据类型,而要用_variant_t转换一下
_variant_t(XX)可以把大多数类型的变量转换成适合的类型传入:
(2)、_variant_t var;_variant_t -> long: (long)var;
_variant_t -> CString: CString strValue = (LPCSTR)_bstr_t(var);
CString -> _variant_t: _variant_t(strSql);
2、BSTR宽字符串与CString相互转换

BSTR bstr;
CString strSql;
CString -> BSTR: bstr = strSql.AllocSysString();
BSTR -> CString: strSql = (LPCSTR)bstr;
3、_bstr_t与CString相互转换

_bstr_t bstr;
CString strSql;
CString -> _bstr_t: bstr = (_bstr_t)strSql;
_bstr_t -> CString: strSql = (LPCSTR)bstr;
4、关于时间
Access:表示时间的字符串#2004-4-5#
Sql:表示时间的字符串''2004-4-5''
DateField(时间字段) select * from my_table where DateField > #2004-4-10#



try
{
m_pCommand->CommandText = "INSERT INTO tTest(age) VALUES('23f2') ";
m_pRecordset = m_pCommand->Execute(NULL,NULL, adCmdText);
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
Top

ODBC链接

适合数据库类型 链接方式
access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"
Oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"
MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"
MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"


OLEDB链接

适合的数据库类型 链接方式
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
Oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties'text;FMT=Delimited'"

0
0
分享到:
评论
1 楼 zyh1991524 2012-08-27  
我也在学习当中,呵呵。

相关推荐

    c++封装MYSQL数据库连接代码

    在C++编程中,与MySQL数据库进行交互是常见的任务,特别是...以上就是关于"C++封装MYSQL数据库连接代码"的核心知识点。通过这样的封装,开发者可以方便地在C++应用程序中集成数据库操作,同时保持代码的整洁和模块化。

    C++读取access数据库代码

    ### C++读取Access数据库代码解析 #### 一、引言 在开发过程中,经常会遇到需要使用C++来操作数据库的情况。本篇文章将基于提供的代码片段,深入解析如何使用C++来读取Microsoft Access数据库中的数据,并在此基础...

    C#操作和连接数据库的动态库,可用于C++

    总的来说,这个C#操作和连接数据库的动态库为C++开发者提供了一种方便的方式来与数据库进行交互,无需从头编写数据库访问代码,极大地提高了开发效率和代码的可维护性。然而,正确使用和理解DLL的工作原理、数据库...

    C++ MFC连接数据库(VisualStudio开发)

    连接数据库的关键步骤包括: 1. **头文件和库引用**:在你的源代码中,包含必要的头文件,如`#include <mysql_driver.h>`和`#include <mysql_connection.h>`。同时,确保链接器设置中包含了MySQL C++连接器的库。 ...

    Sqlite3 C++ 简单单例数据库操作类封装

    当多个对象需要共享同一个数据库连接时,单例模式就显得尤为重要,它可以保证所有操作都通过同一连接进行,避免了多线程环境下的并发问题。 在提供的文件列表中,`CSqlite3.cpp`和`CSqlite3.h`是实现单例数据库操作...

    c++ 连接mysql 跨平台

    当我们谈论"C++连接MySQL跨平台"时,我们关注的是如何在不同的操作系统(如Windows、Linux、macOS等)上使用C++编写程序来与MySQL数据库进行交互。这涉及到C++的MySQL客户端库(通常称为libmysqlclient)的使用,它...

    QT C++学习代码案例

    QT C++学习代码案例是为初学者准备的一系列实践教程,旨在帮助他们快速掌握QT库在C++编程中的应用。这个资源包含32个精心设计的代码实例,涵盖了QT库的基础到进阶功能,使学习者能够从实践中理解并运用QT。 首先,...

    C++下操作access数据库

    根据给定的文件信息,我们可以总结出以下关于“在 C++ 下操作 Access 数据库”的相关知识点: ### 一、概述 在本示例代码中,我们看到了如何利用 ActiveX Data Objects (ADO) 库来实现对 Microsoft Access 数据库...

    windows关于qt的数据库操作封装类以及用例,c++代码

    自动与sqlite3数据库做连接 数据的插入,查询,删除、更新操作 数据库建立与表建立 支持关于where语句查询的自动拼接。 支持text的模糊查询 windows 关于qt的数据库操作封装类 以及用例: SQLite,是一款轻型的...

    面试-C++操作系统数据库设计模式

    它被广泛应用于数据库连接池、日志记录器等。 25. 回调函数和工厂模式: 回调函数是一种把函数指针作为参数传递给另一个函数的技术,允许函数在内部调用其他函数。 工厂模式是一种创建型设计模式,提供一个创建对象...

    c++ 添加数据库服务配置源码

    在连接数据库之前,你需要初始化环境句柄和上下文句柄。`OCIEnvCreate`函数用于创建环境句柄,同时可以设置错误处理回调等。 4. **SQL语句的执行**: 通过`OCIParse`函数解析SQL语句,然后用`OCIBindByPos`或`...

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip C++ 调用 MYSQL API 连接池 ## environment: * VS2022 * MySQL8.0.27 ## 高并发下频繁处理瓶颈 * 建立通信:`TCP三次握手` * 数据库服务器的`连接认证...

    Visaul C++数据库开发技术

    《Visual C++数据库开发技术》一书深入探讨了在Visual C++ 6.0环境下进行数据库应用程序开发的各种方法和技术。本书旨在帮助读者掌握利用Visual C++进行高效数据库操作的技能,涉及的内容广泛且实用,涵盖了从基础到...

    Visual C++数据库编程快速入门

    1. **连接数据库**:在C++中,连接数据库的第一步是创建一个`CConnection`对象,然后使用适当的连接字符串设置其属性。连接字符串包含了数据库的位置、类型、用户名和密码等信息。 2. **执行SQL命令**:使用`...

    数据库连接与配置保存工具

    6. **示例代码**:可能包含使用BDE连接数据库的Delphi代码示例,帮助开发者快速上手。 7. **日志记录**:记录配置过程中的错误和警告,方便排查问题。 对于Delphi开发者而言,掌握如何利用这样的工具进行数据库连接...

    C++Builder案例开发集锦源代码

    3. **数据库访问**:C++Builder支持多种数据库接口,如BDE(Borland Database Engine)和FireDAC,允许开发者轻松地连接和操作数据库。案例可能包含如何创建数据库连接、执行SQL语句、填充数据集以及显示数据库信息...

    用BorlandC_Builder6实现数据库与Excel的数据共享.pdf

    ### 使用Borland C++ Builder 6 实现数据库与Excel的数据共享 #### 一、引言 Borland C++ Builder 是一款由 Borland 公司推出的基于 C++ 的快速应用程序开发 (RAD) 工具,它融合了高级组件概念与高效的 C++ 语言。...

    使用数据源向导创建主从关系表C++.net源代码编写

    在C++.NET编程环境中,创建主从关系表是数据库应用开发中的常见任务,这涉及到数据库对象之间的关联,比如一个表(主表)与另一个表(从表)通过共享的键字段形成一对多的关系。本教程将详细介绍如何使用数据源向导...

    共享顺风车项目源代码压缩文件

    共享顺风车项目源代码压缩文件提供了实现高并发共享出行服务的编程实例,主要涉及到的编程语言是C++,并且运用了线程池和libevent库来处理并发事件。在这个项目中,我们可以深入理解如何在分布式系统中构建高效、可...

    CAA连接Sql数据库

    总的来说,这个“CAA连接Sql数据库C++”项目为Catia用户提供了一个实用的工具,它演示了如何通过CAA和VC++编程技术,结合SQL数据库,实现设计数据的管理和共享,这对于提升企业级的协同设计效率具有重要意义。

Global site tag (gtag.js) - Google Analytics