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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? odb.cpp

?? 用C語言寫的一個數據庫
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// 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


#define MAXROWS 10


//////////////////////////////////////////////////////////////////
// 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;
	CString GetMultiRow( int Row ) 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*MAXROWS];
		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;
}

CString COdb::OdbField::GetMultiRow( int Row ) 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
	//

	/* should test !! */
	CString csResult;
	csResult.Format("%.*s", wLen, (const char*)pBuffer+Row*wSize);
	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;

	/* add by lf */
	OCIStmt *hpStatement;
};

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

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

	hpStatement = NULL;
}

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

COdb::COdb()
{
	m_po = new OdbContext;
	TRACE("\n ODB initialize OK!");
}

COdb::~COdb()
{
	Close();
	delete m_po;
	TRACE("\n ODB exit!");
}

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,
		(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 += "\n" + 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,
		OCI_DEFAULT )
		);
	if ( FAILED(m_po->hr) )
		return m_po->hr;

	// Specify session handle to service context
	OCIAttrSet( m_po->hpContext,
		OCI_HTYPE_SVCCTX,
		hpSession,
		0,
		OCI_ATTR_SESSION,
		m_po->hpErr
		);

	// Change date format
	if ( SUCCEEDED(m_po->hr) )
	{
		CString csSQL = "alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss'";
		m_po->hr = Exec( csSQL );
	}

	/* Alloc OCIHandle, add by lf */
	Exec_Before();

	return m_po->hr;
}

HRESULT COdb::Close()
{
	//
	// This closes and/or cleans up the connection
	// It should work even if the connection is closed or partly open
	//
	m_po->hr = OCI_SUCCESS;

	// Free select statement handle

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品区一区二区三区| 51久久夜色精品国产麻豆| 国产欧美一区二区精品久导航| 激情亚洲综合在线| 久久久久久久久久久久电影| 成人黄色电影在线| 一区二区三区四区国产精品| 欧美日韩综合在线| 美女久久久精品| 日本一区二区电影| 91精品福利在线| 久久精品国产在热久久| 日本一区二区三区四区| 欧美性极品少妇| 韩国精品主播一区二区在线观看| 国产精品久久久一区麻豆最新章节| 91麻豆精东视频| 人人超碰91尤物精品国产| 2024国产精品视频| 91国内精品野花午夜精品| 免费国产亚洲视频| 中文字幕在线一区免费| 色综合色狠狠天天综合色| 欧美精品一区二区在线播放| 国产午夜精品一区二区三区四区| 久久久久亚洲蜜桃| 色婷婷国产精品久久包臀 | 91精品国产综合久久久久久久久久| 蜜臀av亚洲一区中文字幕| 久久综合999| 欧美天堂一区二区三区| 国内成+人亚洲+欧美+综合在线| 1000精品久久久久久久久| 91精品国产乱码久久蜜臀| 成人免费不卡视频| 蜜桃av一区二区三区电影| 亚洲另类一区二区| 久久精品亚洲国产奇米99| 欧美日韩精品欧美日韩精品 | 日韩精品电影在线观看| 欧美国产丝袜视频| 日韩欧美一区二区久久婷婷| 日本韩国精品在线| 国产91精品一区二区麻豆亚洲| 午夜精品一区在线观看| 国产精品国产精品国产专区不蜜 | 成人午夜精品一区二区三区| 三级欧美在线一区| 亚洲人成在线播放网站岛国| 久久久亚洲欧洲日产国码αv| 欧美日韩亚洲另类| 91丝袜美腿高跟国产极品老师| 黑人精品欧美一区二区蜜桃| 无码av免费一区二区三区试看 | 欧美性感一类影片在线播放| 成人免费视频视频在线观看免费| 喷水一区二区三区| 亚洲成人免费影院| 亚洲黄色片在线观看| 国产精品久久久一本精品 | 91精品欧美久久久久久动漫| 欧美性一区二区| 99免费精品视频| 国产精品 欧美精品| 久久99久久99| 蜜臀av亚洲一区中文字幕| 日韩在线一二三区| 日韩国产高清影视| 丝袜美腿高跟呻吟高潮一区| 午夜精品久久久久久久久久| 亚洲国产精品久久久男人的天堂| 亚洲一区二区美女| 99精品视频一区二区三区| 成人午夜在线视频| 国产suv精品一区二区6| 成人美女在线视频| 不卡av在线免费观看| 99精品国产一区二区三区不卡| 成人av在线影院| 91蜜桃网址入口| 欧美性猛片xxxx免费看久爱| 欧美日韩午夜在线视频| 日韩一区二区三区精品视频| 欧美mv和日韩mv的网站| 欧美精品一区二区在线观看| 国产免费久久精品| 日韩理论在线观看| 亚洲宅男天堂在线观看无病毒| 亚洲成人高清在线| 久久99久久精品| 成人av在线电影| 欧美综合天天夜夜久久| 91精品免费在线| 久久久精品综合| 中文字幕一区不卡| 亚洲第一主播视频| 精品中文字幕一区二区小辣椒| 国产一区不卡精品| 91免费版在线| 欧美一区二区三区四区五区| 国产无遮挡一区二区三区毛片日本| 国产片一区二区三区| 一区二区视频在线| 欧美aⅴ一区二区三区视频| 国产精品香蕉一区二区三区| 日本久久电影网| 欧美一区二区三区在线看| 久久久www成人免费毛片麻豆 | 亚洲乱码国产乱码精品精可以看 | 91毛片在线观看| 欧美日韩一区在线| 久久影院午夜论| 亚洲欧美一区二区三区国产精品 | 亚洲一区日韩精品中文字幕| 免费观看一级特黄欧美大片| 成人禁用看黄a在线| 欧美无砖专区一中文字| 久久久久99精品一区| 亚洲第一激情av| 国产成人精品免费看| 欧美私人免费视频| 亚洲国产精品成人综合色在线婷婷 | 日韩午夜精品视频| 最新国产精品久久精品| 久久精品国产99久久6| 色一区在线观看| 久久久99精品免费观看不卡| 亚洲成人一区二区| 成人蜜臀av电影| 亚洲精品一区二区三区精华液| 一区二区在线电影| 成人午夜精品一区二区三区| 欧美日韩国产一区二区三区地区| 中文成人综合网| 裸体健美xxxx欧美裸体表演| 在线中文字幕一区| 国产日韩欧美a| 久久国产视频网| 欧美精品vⅰdeose4hd| 亚洲精品欧美二区三区中文字幕| 国产精品亚洲第一| 欧美大片国产精品| 天天综合日日夜夜精品| av激情综合网| 久久久久久久久久久久久久久99| 奇米精品一区二区三区在线观看一 | 亚洲一区二区在线视频| 成人精品高清在线| 国产无遮挡一区二区三区毛片日本| 青草国产精品久久久久久| 在线观看欧美精品| 一区二区三区日本| 99久久国产综合精品色伊 | 精品国产一区二区亚洲人成毛片| 偷拍一区二区三区四区| 欧美午夜精品久久久| 亚洲人成电影网站色mp4| 国产精品一区专区| 国产欧美一区二区在线观看| 激情都市一区二区| 337p日本欧洲亚洲大胆色噜噜| 青草国产精品久久久久久| 欧美另类videos死尸| 亚洲成人av电影| 欧美一区二区三区婷婷月色 | 亚洲男人的天堂av| 欧美一二三区在线| 久久不见久久见免费视频7 | 蜜臀av性久久久久蜜臀av麻豆| 欧美日韩亚洲不卡| 肉丝袜脚交视频一区二区| 欧美日韩黄视频| 日本不卡一二三| 欧美xfplay| 国产精品88888| 中文字幕乱码一区二区免费| 成人不卡免费av| 亚洲黄色性网站| 7777精品伊人久久久大香线蕉完整版 | 午夜激情综合网| 欧美一级生活片| 久草在线在线精品观看| 欧美sm美女调教| 国产成人精品免费一区二区| 中文字幕在线观看不卡视频| 99久久精品国产一区| 亚洲曰韩产成在线| 日韩一级片网站| 成人高清免费观看| 亚洲国产毛片aaaaa无费看| 欧美精品第1页| 国产久卡久卡久卡久卡视频精品| 久久久久一区二区三区四区| av电影在线观看不卡| 午夜国产精品影院在线观看| 欧美不卡激情三级在线观看| 国产激情91久久精品导航| 亚洲激情av在线| 欧美精品一区二区精品网| 99麻豆久久久国产精品免费优播|