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. Zend_Frameowrk中进行多语言国际化的相关的配置和使用

    在使用Zend_Framework建立网站,若网站在以后的使用中面向国际,这时就需要实现网站的多语言国际化问题.使用Zend_Framework开发的网站需要进行多语言的开发时,就需要用到了Zend_ ...

  2. Ftrl in tensorflow

    reference :点击这里https://github.com/tensorflow/tensorflow/issues/3725 讲解 http://www.tuicool.com/articl ...

  3. Access restriction: The type TaskTopicResolver is not accessible due to restrict

    Access restriction: The type TaskTopicResolver is not accessible due to restrict :  Eclipse 默认把这些受访问 ...

  4. Android ShapeDrawable

    今天做项目碰到一个这样的情况,就是颜色指示框,用的是正方形边框是黑色的,里面填充颜色,颜色值是动态的,为了解决这个问题,查了好多资料,终于找到解决的方法,利用ShapeDrawable,我们自定义一个 ...

  5. leetcode 日记 4sum java

    整体思路同之前的一样,依然采取降低维度的方式进行 public List<List<Integer>> solution(int nums[], int target) { L ...

  6. c语言计算矩阵特征值和特征向量-1(幂法)

    #include <stdio.h> #include <math.h> #include <stdlib.h> #define M 3 //方阵的行数 列数 #d ...

  7. POJ 题目3661 Running(区间DP)

    Running Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5652   Accepted: 2128 Descripti ...

  8. 火狐和IE浏览器的兼容问题汇总

    1.window.event code=(navigator.appName="Netscape")?event.which:event.keycode; 2.event.x mx ...

  9. 关于freeCAD

    FreeCAD界面 FreeCAD的功能目的是成为一个3D CAD 建模工具.她的开发完全遵循 Open Source (GPL & LGPL License)协议. FreeCAD的目标直指 ...

  10. Activity的保存状态和状态恢复

    Activity的保存状态和状态恢复 当系统内存不足时,系统会强制结束一些不可见的Activity以节省内存资源.在某些情况下,当被强制结束的Activity再次显示时会出现一些问题. 例如:一个AP ...