亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? odb.cpp

?? VC下通過Oracle OCI方式連接數(shù)據(jù)庫(kù)。
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
// Odb.cpp
//
// Release 1, Copyright (C) 1999 Ben Bryant
// This is sample source code, nothing more is implied. Use it only as such.
// This software is provided 'as-is', without warranty. In no event will the
// author be held liable for any damages arising from the use of this software.
// Permission is granted to anyone to use this software for any purpose.
// The origin of this software must not be misrepresented; you must not claim
// that you wrote the original software. Altered source versions must be plainly
// marked as such, and must not be misrepresented as being the original software.
// Ben Bryant bcbryant@firstobject.com

#include "stdafx.h"
#include "Odb.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////
// Oracle Call Interface (OCI) Wrapper
//
#ifdef __STDC__
#include <oci.h>
#else
#define __STDC__ 1
#include <oci.h>
#undef __STDC__
#endif

//////////////////////////////////////////////////////////////////////
// COdb::OdbField
//////////////////////////////////////////////////////////////////////

struct COdb::OdbField
{
	//
	// This structure maintains an OCI field/column/variable
	//
	CString csName;
	dvoid* pBuffer;
	ub2 wType;
	ub2 wSize;
	ub2 wLen;
	sb2 nInd;
	BOOL bQuotedOnUpdate;

	// Methods
	OdbField();
	~OdbField();
	void SetSize( ub2 w );
	void Set( CString cs );
	CString Get() const;
	void Free();
};

COdb::OdbField::OdbField()
{
	pBuffer = NULL;
	wType = SQLT_STR;
	wSize = 0;
	wLen = 0;
	nInd = 0;
	bQuotedOnUpdate = TRUE;
}

COdb::OdbField::~OdbField()
{
	Free();
}

void COdb::OdbField::SetSize( ub2 w )
{
	//
	// Make sure buffer is at least size w
	//
	if ( w > wSize || ! pBuffer )
	{
		Free();
		pBuffer = (dvoid*) new char[w];
		wSize = w;
	}
}

void COdb::OdbField::Set( CString cs )
{
	//
	// Set buffer to hold CString
	//
	wLen = cs.GetLength() + 1;
	SetSize( wLen );
	strcpy( (char*)pBuffer, cs );
}

CString COdb::OdbField::Get() const
{
	//
	// All fields are converted to strings by the OCI
	// because SQLT_STR and SQLT_LNG are specified when binding fields
	// Copy from buffer into a string
	//
	CString csResult;
	csResult.Format("%.*s", wLen, (const char*)pBuffer);
	csResult.TrimRight();
	return csResult;
}

void COdb::OdbField::Free()
{
	//
	// Free field's allocated buffer
	//
	if ( pBuffer )
	{
		delete pBuffer;
		pBuffer = NULL;
	}
}

//////////////////////////////////////////////////////////////////////
// COdb::OdbRecordSet
//////////////////////////////////////////////////////////////////////

struct COdb::OdbRecordSet
{
	//
	// This structure maintains a recordset
	// A recordset holds a row of select results
	//
	CPtrArray paFields;
	int m_nRows;
	CString m_csStatement;

	// Methods
	OdbRecordSet();
	~OdbRecordSet();
	int Find( const CString& csName );
	void RemoveAll();
};

COdb::OdbRecordSet::OdbRecordSet()
{
}

COdb::OdbRecordSet::~OdbRecordSet()
{
	RemoveAll();
}

void COdb::OdbRecordSet::RemoveAll()
{
	//
	// Remove fields
	//
	for ( int iField=0; iField<paFields.GetSize(); ++iField )
		delete (OdbField*)paFields[iField];
	paFields.RemoveAll();
}

int COdb::OdbRecordSet::Find( const CString& csName )
{
	//
	// Return iField or -1 if name not found
	//
	for ( int iField=0; iField<paFields.GetSize(); ++iField )
	{
		OdbField* pField = (OdbField*)paFields.GetAt( iField );
		if ( pField->csName == csName )
			return iField;
	}
	return -1;
}

//////////////////////////////////////////////////////////////////////
// OdbContext
//////////////////////////////////////////////////////////////////////

struct COdb::OdbContext
{
	//
	// This structure maintains all of the OCI variables
	// It is declared here rather than in the header
	// to isolate OCI from COdb clients
	//
	OdbContext();
	void Clear();
	char szError[512];
	HRESULT hr;
	OCIEnv* hpEnv;
	OCIServer* hpServer;
	OCIError* hpErr;
	OCISvcCtx* hpContext;
	OCIStmt *hpSelect;
	OdbRecordSet rsSelect;
};

COdb::OdbContext::OdbContext()
{
	Clear();
}

void COdb::OdbContext::Clear()
{
	hr = OCI_SUCCESS;
	hpEnv = NULL;
	hpErr = NULL;
	hpServer = NULL;
	hpContext = NULL;
	hpSelect = NULL;
	szError[0] = '\0';
}

//////////////////////////////////////////////////////////////////////
// COdb
//////////////////////////////////////////////////////////////////////

COdb::COdb()
{
	m_po = new OdbContext;
}

COdb::~COdb()
{
	Close();
	delete m_po;
}

void COdb::CheckErr( short status )
{
	//
	// This sets the OCI error string
	// Later, this might be made to generate an exception
	// The table of codes and strings is kept here in a static array
	//
	static struct CErrorPair
	{
		sword w;
		const char* szText;
	}
		epaErrors[] =
	{
		OCI_SUCCESS, "SUCCESS",
		OCI_SUCCESS_WITH_INFO, "SUCCESS_WITH_INFO",
		OCI_NEED_DATA, "NEED_DATA",
		OCI_NO_DATA, "NO_DATA",
		OCI_INVALID_HANDLE, "INVALID_HANDLE",
		OCI_STILL_EXECUTING, "STILL_EXECUTE",
		OCI_CONTINUE, "CONTINUE",
	};

	// Check status
	m_po->hr = status;
	if ( m_po->hr == OCI_ERROR )
	{
		// for the special case OCI_ERROR, call OCIErrorGet for the string
		sb4 errcode = 0;
	    OCIErrorGet(m_po->hpErr, 1, NULL, &errcode, (unsigned char*)m_po->szError, sizeof(m_po->szError), OCI_HTYPE_ERROR);
	}
	else
	{
		// Look for description in static array
		DWORD nTotalResultCodes = sizeof(epaErrors) / sizeof(CErrorPair);
		for ( int iPos = 0; iPos < sizeof(epaErrors); ++ iPos )
		{
			if ( epaErrors[iPos].w == m_po->hr )
			{
				strcpy( m_po->szError, epaErrors[iPos].szText );
				break;
			}
		}
	}
}

CString COdb::GetErrorDescription()
{
	return m_po->szError;
}

HRESULT COdb::Open( const CString csConnect )
{
	//
	// This opens a connection with the database
	// Connect string format is user/password@host
	//
	CString csUser, csPassword, csServer;
	int iSlash = csConnect.Find("/");
	if ( iSlash > -1 )
	{
		csUser = csConnect.Left(iSlash);
		csPassword = csConnect.Mid(iSlash + 1);
		int iAt = csConnect.Find("@");
		if ( iAt > iSlash )
		{
			csPassword = csConnect.Mid( iSlash + 1, iAt - iSlash - 1 );
			csServer = csConnect.Mid(iAt + 1);
		}
	}
	else
	{
		csUser = csConnect;
	}
	if ( csUser.IsEmpty() && csPassword.IsEmpty() )
	{
		// For default OS logon, specify slash for user name and password
		csUser = "/";
		csPassword = "/";
	}

	// First, we make sure its closed
	Close();

	// Initialize OCI DLL specifying the mode
	CheckErr( OCIInitialize( OCI_OBJECT, NULL, NULL, NULL, NULL ) );
	if ( FAILED(m_po->hr) )
		return m_po->hr;

	// Note an alternative is to use the OCILogon/Logoff functions
	// Here we allocate all of the handles explicitly
	// Initialize the environment handle
	CheckErr( OCIEnvInit( &m_po->hpEnv, OCI_DEFAULT, 0, NULL ) );
	if ( FAILED(m_po->hr) )
		return m_po->hr;

	// Allocate error, server, and service context handles
	OCIHandleAlloc( m_po->hpEnv, (void**)&m_po->hpErr, OCI_HTYPE_ERROR, 0, NULL );
	OCIHandleAlloc( m_po->hpEnv, (void**)&m_po->hpServer, OCI_HTYPE_SERVER, 0, NULL );
	OCIHandleAlloc( m_po->hpEnv, (void**)&m_po->hpContext, OCI_HTYPE_SVCCTX, 0, NULL );

	// Associate TNS with server handle
	CheckErr( OCIServerAttach( m_po->hpServer,
		m_po->hpErr,
		(const unsigned char*)(const char*)csServer,
		csServer.GetLength(),
		0 )
		);
	if ( FAILED(m_po->hr) )
		return m_po->hr;

	// Get server version string
	const nVersionLength = 1024;
	CString csVersion;
	CheckErr( OCIServerVersion( m_po->hpServer,
		m_po->hpErr,
		(text*)csVersion.GetBuffer(nVersionLength),
		nVersionLength,
		OCI_HTYPE_SERVER )
		);
	if ( FAILED(m_po->hr) )
		return m_po->hr;
	csVersion.ReleaseBuffer();
	m_csLog += csVersion + "\n";

	// Specify server handle to service context
	CheckErr( OCIAttrSet( m_po->hpContext,
		OCI_HTYPE_SVCCTX,
		m_po->hpServer,
		0,
		OCI_ATTR_SERVER,
		m_po->hpErr )
		);
	if ( FAILED(m_po->hr) )
		return m_po->hr;

	// Allocate a session handle
	OCISession *hpSession = NULL;
	OCIHandleAlloc( m_po->hpEnv, (void**)&hpSession, OCI_HTYPE_SESSION, 0, NULL);

	// Associate username with session handle
	OCIAttrSet( hpSession,
		OCI_HTYPE_SESSION,
		(void*)(const char*)csUser,
		csUser.GetLength(),
		OCI_ATTR_USERNAME,
		m_po->hpErr
		);

	// Associate password with session handle
	OCIAttrSet( hpSession,
		OCI_HTYPE_SESSION,
		(void*)(const char*)csPassword,
		csPassword.GetLength(),
		OCI_ATTR_PASSWORD,
		m_po->hpErr
		);

	// Open session using service context and session handle
	CheckErr( OCISessionBegin( m_po->hpContext,
		m_po->hpErr,
		hpSession,
		OCI_CRED_RDBMS,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久精品综合| 欧美一区二区视频在线观看| 国产剧情av麻豆香蕉精品| 麻豆成人av在线| 精品一区二区三区日韩| 久久99国内精品| 国产自产高清不卡| 丰满亚洲少妇av| 成人18视频在线播放| 99久久99久久免费精品蜜臀| 91丨九色丨尤物| 一本色道综合亚洲| 欧美日韩一级视频| 91视频精品在这里| 亚洲bdsm女犯bdsm网站| 日韩一区精品字幕| 国产在线精品一区二区不卡了 | 久久婷婷国产综合精品青草| 欧美一区二区三区视频在线| 免费看黄色91| 国产在线日韩欧美| 成人av网在线| 欧美日韩成人在线| 久久婷婷国产综合精品青草| 亚洲欧美视频在线观看视频| 五月婷婷综合网| 国产成人免费xxxxxxxx| 欧美性色aⅴ视频一区日韩精品| 欧美精品欧美精品系列| 国产欧美精品一区aⅴ影院| 一区二区在线观看视频 | 亚洲婷婷在线视频| 亚州成人在线电影| 成人永久看片免费视频天堂| 欧美亚洲一区二区在线| 国产丝袜欧美中文另类| 午夜精品久久久久久久久| 国产精品一区二区三区四区 | 午夜av一区二区| 国模大尺度一区二区三区| 色噜噜狠狠一区二区三区果冻| 欧美精品自拍偷拍动漫精品| 欧美国产亚洲另类动漫| 日本在线不卡一区| 日本乱人伦aⅴ精品| 久久久精品人体av艺术| 午夜精品国产更新| 99视频一区二区| 国产午夜精品久久| 日韩**一区毛片| 在线免费观看日本一区| 久久女同精品一区二区| 日本不卡不码高清免费观看| 91在线观看一区二区| 久久影院电视剧免费观看| 亚洲地区一二三色| 色88888久久久久久影院野外| 日本一区二区三区四区| 男男gaygay亚洲| 制服丝袜亚洲网站| 一区二区高清免费观看影视大全 | 国产精品网站在线播放| 国产精品系列在线播放| 日韩av网站在线观看| 蜜桃一区二区三区在线观看| 日韩电影一二三区| 久久午夜老司机| 欧美人伦禁忌dvd放荡欲情| 另类的小说在线视频另类成人小视频在线 | 国产一区二区视频在线| 欧美日韩免费观看一区二区三区| 国产一区二区在线影院| 91麻豆精品国产91久久久使用方法| 亚洲私人影院在线观看| 成人毛片在线观看| 国产欧美日韩另类视频免费观看| 国产一区二区主播在线| 久久色在线观看| 国产不卡一区视频| 亚洲欧美在线aaa| 91亚洲精品一区二区乱码| 日韩一区在线免费观看| 色婷婷综合中文久久一本| 一区二区三区精品| 欧美一区二区三区在线| 黄网站免费久久| 国产日韩av一区| av亚洲精华国产精华| 亚洲综合在线观看视频| 欧美男男青年gay1069videost| 日韩国产欧美在线观看| 久久这里只有精品首页| 成人动漫一区二区| 亚洲国产一区二区a毛片| 7777女厕盗摄久久久| 国模大尺度一区二区三区| 国产精品美女久久久久久久久 | 国产精品免费视频网站| 91麻豆高清视频| 亚洲国产中文字幕在线视频综合| 91免费视频网| 精品久久一二三区| 99久久久久免费精品国产 | 精品奇米国产一区二区三区| 国产精品系列在线播放| 亚洲一级在线观看| 久久久综合视频| 欧美在线视频你懂得| 精品亚洲国产成人av制服丝袜| 综合亚洲深深色噜噜狠狠网站| 欧美日韩在线不卡| 成人av综合一区| 日韩成人免费看| 中文字幕一区二区三区在线观看| 在线播放91灌醉迷j高跟美女| 粉嫩aⅴ一区二区三区四区五区| 亚洲国产日韩精品| 欧美激情一区二区三区| 7777精品伊人久久久大香线蕉完整版 | 9191久久久久久久久久久| 国产在线精品免费| 亚洲国产乱码最新视频 | 国产精品美女久久久久高潮| 欧美日本一区二区三区| 白白色 亚洲乱淫| 久久激情五月婷婷| 午夜私人影院久久久久| 中文字幕在线不卡| 国产午夜精品福利| 精品免费国产一区二区三区四区| 欧美美女喷水视频| 日本精品一区二区三区高清| caoporn国产一区二区| 国产夫妻精品视频| 紧缚奴在线一区二区三区| 香蕉成人啪国产精品视频综合网 | 高清在线不卡av| 国产真实乱偷精品视频免| 天堂成人免费av电影一区| 亚洲欧洲中文日韩久久av乱码| 国产日产精品1区| 2020国产精品自拍| 亚洲精品在线免费观看视频| 日韩欧美一区二区久久婷婷| 91 com成人网| 91精品国产一区二区三区| 欧美三级在线播放| 欧美另类高清zo欧美| 欧美日韩国产一级| 欧美日韩午夜影院| 91麻豆精品国产91久久久使用方法| 欧美精品乱码久久久久久| 欧美片网站yy| 欧美一区二区三区免费大片 | 91免费视频网| 日本韩国欧美国产| 欧美羞羞免费网站| 这里是久久伊人| 欧美xxxxx牲另类人与| 欧美成人video| 久久精品一级爱片| 亚洲视频免费在线| 亚洲午夜在线电影| 日韩在线一区二区| 麻豆精品一区二区综合av| 国产一区在线视频| 成人美女在线观看| 在线免费观看一区| 欧美大片免费久久精品三p| 亚洲精品一线二线三线| 国产精品剧情在线亚洲| 一区二区三区影院| 蜜臀av一区二区| 国产a级毛片一区| 欧美调教femdomvk| 久久综合色8888| 亚洲日本在线a| 免费人成黄页网站在线一区二区| 国产在线不卡一区| 99精品欧美一区二区蜜桃免费| 欧美日韩国产高清一区二区三区| 欧美成人三级在线| 中文字幕中文字幕一区| 亚洲小少妇裸体bbw| 国产一区二区福利| 欧美日韩在线综合| 国产视频在线观看一区二区三区| 夜色激情一区二区| 国产主播一区二区| 欧美妇女性影城| 中文字幕在线不卡国产视频| 久久精品999| 在线精品视频一区二区三四| 精品国产乱码久久| 亚洲精品中文在线| 国产经典欧美精品| 69p69国产精品| 亚洲黄色尤物视频| 成人午夜视频在线观看| 日韩网站在线看片你懂的|