ADO是microsoft数据库应用程序开发的连连接口,是建立在OLE DB之上的高层

ADO使用方法步骤:

1.初始化COM库,引入ADO库定义

2.用connection对象连接数据库

3.利用连接好的连接,通过connection,command对象执行sql 语句。或利用recordset对象取得结果集进行处理

4.使用完关闭连接对象

#pragma once
#import "C:\\Program Files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#include <vector>
using namespace std;
class CDataBaseADO
{
public:
CDataBaseADO(void);
public:
~CDataBaseADO(void);
public:
bool Open(_bstr_t strConnection); //打开数据库
bool Close(void); //关闭数据库 需要成对出现 bool Select(BSTR strsql,vector<_variant_t> strName, vector< vector<_variant_t> > & Ret);
int ExcuteSQL(_bstr_t CommandText,bool IsText = true);
private:
_ConnectionPtr m_pConnection; }; #include "StdAfx.h"
#include "DataBaseADO.h" CDataBaseADO::CDataBaseADO(void)
{
::CoInitialize(NULL);
m_pConnection = NULL;
} CDataBaseADO::~CDataBaseADO(void)
{
if(m_pConnection)
{
m_pConnection->Close();
m_pConnection=NULL;
}
::CoUninitialize();
} bool CDataBaseADO::Open( _bstr_t strConnection )
{
if(FAILED(m_pConnection.CreateInstance(__uuidof(Connection))))//初始化Connection
return false;
try
{
m_pConnection->Open(strConnection,"","",0);
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return true;
} bool CDataBaseADO::Close( void )
{
if(m_pConnection)
{
m_pConnection->Close();
m_pConnection = NULL;
return true;
}
return false;
} bool CDataBaseADO::Select( BSTR strsql,vector<_variant_t>strName,vector<vector<_variant_t> >& Ret )
{
_RecordsetPtr pRecordset;
if(FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))//初始化recordset指针
return false;
try
{
pRecordset->Open(strsql,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);//adOpenDynamic:动态 adLockOptimistic:乐观封锁法 adCmdText:文本查询法
pRecordset->MoveFirst();
while(!pRecordset->adoEOF) //遍历所有结果
{
vector<_variant_t> vTheValue;//VARIANT数据类型的泛型
for (int i=0; i < strName.size();i++)
{
vTheValue.push_back(pRecordset->GetCollect(strName.at(i)));//得到字段的值并添加到容器
}
Ret.push_back(vTheValue);
pRecordset->MoveNext(); //移动到下一条记录
}
pRecordset->Close();//关闭连接
pRecordset = NULL;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
return true;
} int CDataBaseADO::ExcuteSQL( _bstr_t CommandText,bool IsText /*= true*/ )
{
_variant_t RecordAffected;
try
{
if(IsText)
{
m_pConnection->Execute(CommandText,&RecordAffected,adCmdText);
}
else
{
m_pConnection->Execute(CommandText,&RecordAffected,adCmdStoredProc);
}
}
catch(_com_error e)
{
return -1;
}
return RecordAffected.intVal;
}

  

	CDataBaseADO m_DataBase;
if(FAILED(m_DataBase.Open("Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=student;Data Source=HJ-PC")))
return ;
int n = m_DataBase.ExcuteSQL("insert into student values('5','wakawaka')");
CString str;
str.Format("已增加一条数据",n);
AfxMessageBox(str);
m_DataBase.Close();
return ;

  

ODBC  API  编程连数据库

#include "sql.h"    //含有基本ODBC API定义
#include "sqlext.h" //含有扩展的ODBC定义
#include "sqltypes.h" #include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <map>
#include <string> #pragma comment(lib,"odbc32.lib"); //库文件 #pragma once
#define FIELD_NUM 1024 using namespace std; typedef vector<map<string,string> > ResFromDB; class CODBCSqlServer
{ private:
SQLHENV V_OD_Env; //Handle ODBC environment
SQLHDBC V_OD_hdbc; //handle connection连接句柄
SQLHSTMT V_OD_hstmt; //sql语句的句柄
SQLINTEGER V_OD_err; //sql语句执行后的错误代码 public:
CODBCSqlServer(void); public:
~CODBCSqlServer(void); public:
bool open();
bool close();
bool Connect( const char * pszDSN, const char *pszUName, const char * passUPasswd);
bool disConnect();
unsigned int SQLQuery(const char * pszSQL,ResFromDB & resAll); //每个字段长度最多30
unsigned int SQLExec( const char* pszSQL );
void ReportError(SQLHSTMT &hstmt, int iHandleType, CString strAlert);
bool ShowError( HANDLE hdbc, SQLSMALLINT type );
}; #include "StdAfx.h"
#include "ODBCSqlServer.h" CODBCSqlServer::CODBCSqlServer(void)
{
V_OD_err = 0;
} CODBCSqlServer::~CODBCSqlServer(void)
{
} bool CODBCSqlServer::open()
{ V_OD_err = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
if( (V_OD_err != SQL_SUCCESS) && (V_OD_err != SQL_SUCCESS_WITH_INFO))
{
OutputDebugString("allochandle error\n");
return false;
} V_OD_err = SQLSetEnvAttr(V_OD_Env,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,SQL_IS_INTEGER);
if( (V_OD_err != SQL_SUCCESS) &&(V_OD_err != SQL_SUCCESS_WITH_INFO) )
{
OutputDebugString("setEnv failed\n");
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
return false;
}
if(V_OD_err == SQL_SUCCESS_WITH_INFO)
{
ShowError(V_OD_hstmt,SQL_HANDLE_STMT);
}
return true; } bool CODBCSqlServer::close()
{ if(V_OD_hstmt != NULL)
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
if(V_OD_hdbc != NULL)
{
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
}
if(V_OD_Env != NULL)
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
return true;
} bool CODBCSqlServer::Connect( const char * pszDSN, const char *pszUName, const char * passUPasswd )
{ if( pszDSN == NULL)
return false; V_OD_err = SQLAllocHandle( SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if( (V_OD_err != SQL_SUCCESS) && (V_OD_err != SQL_SUCCESS_WITH_INFO) )
{
OutputDebugString("allockHDB faile\n");
return false;
}
if(V_OD_err == SQL_SUCCESS_WITH_INFO)
{
ShowError(V_OD_Env,SQL_HANDLE_ENV);
}
V_OD_err = SQLConnect(V_OD_hdbc,(SQLCHAR *)pszDSN,SQL_NTS,(SQLCHAR*)pszUName,SQL_NTS,(SQLCHAR*) passUPasswd,SQL_NTS);
if((V_OD_err != SQL_SUCCESS) && (V_OD_err != SQL_SUCCESS_WITH_INFO))
{
OutputDebugString("sqlconnect failed\n");
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
return false;
}
if(V_OD_err == SQL_SUCCESS_WITH_INFO)
{
ShowError(V_OD_Env,SQL_HANDLE_ENV);
}
OutputDebugString("Conected!\n");
return true;
} bool CODBCSqlServer::disConnect()
{
if(V_OD_hstmt != NULL)
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
if(V_OD_hdbc != NULL)
{
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
} return true;
} unsigned int CODBCSqlServer::SQLQuery( const char * pszSQL,ResFromDB & resAll )
{ if(pszSQL == NULL)
return 0; V_OD_err = SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc , &V_OD_hstmt);
if ((V_OD_err != SQL_SUCCESS) && (V_OD_err != SQL_SUCCESS_WITH_INFO))
{
OutputDebugString("Fehler im AllocStatement\n");
SQLDisconnect( V_OD_hdbc );
SQLFreeHandle( SQL_HANDLE_DBC,V_OD_hdbc );
return false;
}
if(V_OD_err == SQL_SUCCESS_WITH_INFO)
{
ShowError(V_OD_hstmt,SQL_HANDLE_STMT);
} V_OD_err = SQLExecDirect(V_OD_hstmt,(SQLCHAR *)pszSQL, SQL_NTS);
if( (V_OD_err != SQL_SUCCESS) && (V_OD_err != SQL_SUCCESS_WITH_INFO) )
{
OutputDebugString("sqlexecdriect failed\n");
return 0;
}
if(V_OD_err == SQL_SUCCESS_WITH_INFO)
{
ShowError(V_OD_hstmt,SQL_HANDLE_STMT);
} SQLSMALLINT colNum;
V_OD_err = SQLNumResultCols(V_OD_hstmt,&colNum); //得到有多少列
SQLCHAR (*name)[20];
SQLSMALLINT ColumnNameLenthPtr;
SQLSMALLINT DataTypePtr;
SQLUINTEGER ColumnSizePtr;
SQLSMALLINT DecimalDigits;
SQLSMALLINT NullAblePTr; name = new SQLCHAR[colNum][20]; for(int i=1; i<=colNum ; i++) //拿每一列的详细信息,将列名称放入colName的vector
{
memset(name[i-1],0,20);
V_OD_err = SQLDescribeCol(
V_OD_hstmt,
i,
(SQLCHAR *)name[i-1],
20,
&ColumnNameLenthPtr,
&DataTypePtr,
&ColumnSizePtr,
&DecimalDigits,
&NullAblePTr
);
} /*/////////////////////////////////////////
把得到的列名称绑定到结果集中
/////////////////////////////////////////*/
SQLINTEGER ID;
SQLCHAR Name[30];
SQLINTEGER lenthID,lenthName; SQLCHAR (*colValue)[30] = new SQLCHAR[colNum][30]; //申请动态内存存放每一行数据,单格 数据长度不能操作30个字符
for(int j = 0; j<colNum; j++) //初始化动态内存,绑定内存到结果集
{
memset(colValue[j],0,30);
V_OD_err = SQLBindCol(V_OD_hstmt,j+1,SQL_C_CHAR,&colValue[j],30,&lenthName);
} while (TRUE)
{
map<string,string> each;
V_OD_err = SQLFetch(V_OD_hstmt);
if(V_OD_err == SQL_ERROR || V_OD_err == SQL_SUCCESS_WITH_INFO)
{
if(V_OD_err = SQL_SUCCESS_WITH_INFO)
{
ShowError(V_OD_hstmt,SQL_HANDLE_STMT);
}
OutputDebugString("sqlfetch error\n");
}
if(V_OD_err == SQL_SUCCESS || V_OD_err == SQL_SUCCESS_WITH_INFO)
{
for(int k=0; k<colNum; k++)
{
each.insert( std::pair<string,string>((char *)name[k],(char *)colValue[k]) ); //each["11"]="22";
//each.insert(std::pair<int,string>(0,"2"));
} }
else
{
break;
}
resAll.push_back(each); }
delete colValue;
delete name;
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
return colNum;
}
unsigned int CODBCSqlServer::SQLExec( const char* pszSQL )
{
if(pszSQL == NULL)
return 0;
V_OD_err = SQLAllocHandle(SQL_HANDLE_STMT,V_OD_hdbc,&V_OD_hstmt);
if( (V_OD_err != SQL_SUCCESS) && (V_OD_err != SQL_SUCCESS_WITH_INFO) )
{
OutputDebugString("SQLAllocHandle stmt failed!\n");
ShowError(V_OD_hstmt,SQL_HANDLE_STMT);
return -1;
}
V_OD_err = SQLExecDirect(V_OD_hstmt,(unsigned char *)pszSQL,SQL_NTS);
if( (V_OD_err != SQL_SUCCESS) && (V_OD_err != SQL_SUCCESS_WITH_INFO) && (V_OD_err != SQL_NO_DATA))
{
ShowError(V_OD_hstmt,SQL_HANDLE_STMT);
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
V_OD_hstmt = NULL;
return -1;
}
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
V_OD_hstmt = NULL;
return 0;
} void CODBCSqlServer::ReportError( SQLHSTMT &hstmt, int iHandleType, CString strAlert )
{
unsigned char *SQLState = new unsigned char[6];
if(SQLState == NULL)
{
AfxMessageBox("报告错误发生的原因时,分配sqlstate内存失败");
return ;
} char Message[500] = "\0";
short iMesLen;
CString strError;
SQLGetDiagRec(iHandleType, hstmt, 1, SQLState, NULL,
(unsigned char *)Message, 500, &iMesLen);
strError.Format("%s, %s", strAlert, Message);
AfxMessageBox(strError);
delete SQLState;
SQLState = NULL;
} bool CODBCSqlServer::ShowError( HANDLE hdbc, SQLSMALLINT type )
{
SQLCHAR SqlState[6] = {0}, Msg[SQL_MAX_MESSAGE_LENGTH] = {0};
SQLSMALLINT i = 1, MsgLen = 0;
SQLINTEGER NativeError = 0;
SQLRETURN rc2 = SQL_SUCCESS;
CString sqlerror; while((rc2 = SQLGetDiagRec(type, hdbc, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen))
!= SQL_NO_DATA)
{
sqlerror = SqlState;
AfxMessageBox((char *)Msg);
i++;
}
return true;
}

  

void CTestODBCDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CODBCSqlServer odbcServer;
bool bRes = odbcServer.open();
if( !bRes)
{
OutputDebugString("open failed\n");
return;
}
OutputDebugString("open ok\n");
bRes = odbcServer.Connect("LocalServer","sa","123456");
if(!bRes)
{ }
int nRes = 0;
ResFromDB resALL;
nRes = odbcServer.SQLQuery("SELECT * FROM student",resALL); odbcServer.disConnect();
char *pszBuf = NULL;
int nBuf = 0;
int i = 0;
odbcServer.disConnect();
odbcServer.close();
return;
} void CTestODBCDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CODBCSqlServer odbcDemo;
bool re = odbcDemo.open();
odbcDemo.Connect("LocalServer","sa","123456");
int n = odbcDemo.SQLExec("insert into student values(10,'qqqq')");
odbcDemo.disConnect();
odbcDemo.close();
return ;
}

  

ODBC与ADO 连SQL Server 2005的更多相关文章

  1. 浅析SQL Server 2005中的主动式通知机制

    一.引言 在开发多人同时访问的Web应用程序(其实不只这类程序)时,开发人员往往会在缓存策略的设计上狠下功夫.这是因为,如果将这种环境下不常变更的数据临时存放在应用程序服务器或是用户机器上的话,可以避 ...

  2. 转载:Character data is represented incorrectly when the code page of the client computer differs from the code page of the database in SQL Server 2005

    https://support.microsoft.com/en-us/kb/904803 Character data is represented incorrectly when the cod ...

  3. [转]SQL Server 2005 Integration Services (SSIS) (3) - Business Intelligence Development Studio

    本文转自:http://blog.csdn.net/me_online/article/details/1546281 三,SQL Server Integration Services 开发环境– ...

  4. SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)

    在SQL Server 2005环境下,表的主键应该怎样设计.目前主要用到的主键方案共三种: 自动增长主键 手动增长主键 UNIQUEIDENTIFIER主键 1.先说自动增长主键,它的优点是简单,类 ...

  5. SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思 sql server 2005 2008

    原文:http://www.cnblogs.com/ForFreeDom/archive/2009/10/16/1584680.html 在sqlserver2005或SQL2008数据库项目中,创建 ...

  6. 回首经典的SQL Server 2005

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com SQL Server是我使用时间最长的数据库,算起来已经有10年了.上世纪90年代,微软在软件开发的所有领域高歌猛 ...

  7. 监控 SQL Server (2005/2008) 的运行状况

    Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...

  8. windows10下sql server 2005 无法运行或sql server服务无法启动的完美解决方案

    问题:升级windows10后,sql server 2005 无法运行或sql server服务&sql server agent无法启动,如下图,怎么办? 一般情况下,我们第一反应就是sq ...

  9. SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称

    SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称   原来数据库名称为 aa,物理文件名称为 aa.mdf 和 aa_log.ldf:   需要修改数据库名称为 bb,物理文件名 ...

随机推荐

  1. C++小项目:directx11图形程序(三):graphicsclass

    这是框架的第三层graphicsclass,这个类才真正可以说是整个程序的框架,因为它组织了后面所有的成员. 代码: graphicsclass.h #pragma once #include< ...

  2. web.xml中在Servlet中获取context-param和init-param内的参数

    引自:http://blog.csdn.net/yakson/article/details/9203231 web.xml里面可以定义两种参数:1.application范围内的参数,存放在serv ...

  3. Devexpress XtraReport 打印时弹出Margins提示解决办法

    当我们用Dev的报表引擎做报表时,如果把边缘设置为0时会弹出提示. 可以通过代码 XtraReport.PrintingSystem.ShowMarginsWarning = false; 取消该提示

  4. RHEL6.4编译安装企业级LAMMP平台

    一.LAMMP简介 二.使用软件及服务器架构说明 三.配置及安装过程    1.安装arp与httpd    2.安装mysql    3.安装php(php-fpm)    4.安装Xcache   ...

  5. 关于 DWZ 弹出框

    1.弹出框 <a name="***" class="***" href="${** }/***.do?action=***&属性=${ ...

  6. windows上传代码到github

    上传代码到github上有很多种方法,在这里我介绍一种比较简单的一种.工具嘛,越简单越好用啊. 1.首先下载github在windows下的客户端 下载地址:https://desktop.githu ...

  7. poj3662 最短路+二分

    //Accepted 508 KB 79 ms //spfa+二分 //二分需要的花费cost,把图中大于cost的边设为1,小于cost的边设为0,然后spfa求 //最短路,如果小于K则可行,继续 ...

  8. php 画图片3

    <?php // 中文验证码 // 1. 创建画布 $im = imagecreatetruecolor(200, 200); // 2. 创建背景色 // 2.1得到背景颜色 $bg_colo ...

  9. ad bga扇出 和群组布线

    本文关于如何快速规范的bga布线和扇出做笔记 目的:layout一个ili的3+1的控制板.把线距控制在4mil 这样可以节约制造成本. 问题:需要大改布局.尤其是bga扇出和通道连接的问题. 细节: ...

  10. flask SQLAlchemy中一对多的关系实现

    SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...