⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sypodlobjects.cpp

📁 这是一个采用OLE DB编程处理的上传BLOB类型的二进制数据到数据库的一个实例
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	long n4Day;             // Day within 4 year block
							//  (0 is 1/1/yr1, 1460 is 12/31/yr4)
	long n4Yr;              // Year within 4 year block (0,1,2 or 3)
	BOOL bLeap4 = TRUE;     // TRUE if 4 year block includes leap year

	double dblDate = dtSrc; // tempory serial date

	// If a valid date, then this conversion should not overflow
	nDays = (long)dblDate;

	// Round to the second
	dblDate += ((dtSrc > 0.0) ? (1.0/172800.0) : (-1 * (1.0/172800.0)));

	nDaysAbsolute = (long)dblDate + 693959L; // Add days from 1/1/0 to 12/30/1899

	dblDate = fabs(dblDate);
	nSecsInDay = (long)((dblDate - floor(dblDate)) * 86400.);

	// Calculate the day of week (sun=1, mon=2...)
	//   -1 because 1/1/0 is Sat.  +1 because we want 1-based
	//tmDest.tm_wday = (int)((nDaysAbsolute - 1) % 7L) + 1;
	
	// Leap years every 4 yrs except centuries not multiples of 400.
	n400Years = (long)(nDaysAbsolute / 146097L);

	// Set nDaysAbsolute to day within 400-year block
	nDaysAbsolute %= 146097L;

	// -1 because first century has extra day
	n400Century = (long)((nDaysAbsolute - 1) / 36524L);

	// Non-leap century
	if (n400Century != 0)
	{
		// Set nDaysAbsolute to day within century
		nDaysAbsolute = (nDaysAbsolute - 1) % 36524L;

		// +1 because 1st 4 year increment has 1460 days
		n4Years = (long)((nDaysAbsolute + 1) / 1461L);

		if (n4Years != 0)
			n4Day = (long)((nDaysAbsolute + 1) % 1461L);
		else
		{
			bLeap4 = FALSE;
			n4Day = (long)nDaysAbsolute;
		}
	}
	else
	{
		// Leap century - not special case!
		n4Years = (long)(nDaysAbsolute / 1461L);
		n4Day = (long)(nDaysAbsolute % 1461L);
	}

	if (bLeap4)
	{
		// -1 because first year has 366 days
		n4Yr = (n4Day - 1) / 365;

		if (n4Yr != 0)
			n4Day = (n4Day - 1) % 365;
	}
	else
	{
		n4Yr = n4Day / 365;
		n4Day %= 365;
	}

	// n4Day is now 0-based day of year. Save 1-based day of year, year number
	//tmDest.tm_yday = (int)n4Day + 1;
	dbts.year = (short)(n400Years * 400 + n400Century * 100 + n4Years * 4 + n4Yr);

	// Handle leap year: before, on, and after Feb. 29.
	if (n4Yr == 0 && bLeap4)
	{
		// Leap Year
		if (n4Day == 59)
		{
			dbts.month = 2;
			dbts.day = 29;
			goto DoTime;
		}

		// Pretend it's not a leap year for month/day comp.
		if (n4Day >= 60)
			--n4Day;
	}

	// Make n4DaY a 1-based day of non-leap year and compute
	//  month/day for everything but Feb. 29.
	++n4Day;

	// Month number always >= n/32, so save some loop time 
	for (dbts.month = (n4Day >> 5) + 1;
		n4Day > anMonthDayInYear[dbts.month]; dbts.month++);
		
	dbts.day = (int)(n4Day - anMonthDayInYear[dbts.month - 1]);

DoTime:
	if (nSecsInDay == 0)
		dbts.hour = dbts.minute = dbts.second = 0;
	else
	{
		dbts.second = (short)((int)nSecsInDay % 60L);
		nMinutesInDay = nSecsInDay / 60L;
		dbts.minute = (int)nMinutesInDay % 60;
		dbts.hour = (int)nMinutesInDay / 60;
	}

	return dbts;
}

//********************************************************************************

DBDATE DBDateFromDBTS(DBTIMESTAMP dtSrc)
{
	DBDATE mDDRet;

	mDDRet.day = dtSrc.day;
	mDDRet.month = dtSrc.month;
	mDDRet.year = dtSrc.year;

	return mDDRet;
}

//********************************************************************************

DBTIMESTAMP DBTSFromDBDate(DBDATE mDDRet)
{
	DBTIMESTAMP dtSrc;

	memset(&dtSrc, 0, sizeof(DBTIMESTAMP));

	dtSrc.day = mDDRet.day;
	dtSrc.month = mDDRet.month;
	dtSrc.year = mDDRet.year;

	return dtSrc;
}

//********************************************************************************

DBTIME DBTimeFromDBTS(DBTIMESTAMP dtSrc)
{
	DBTIME mDDRet;

	mDDRet.hour = dtSrc.hour;
	mDDRet.minute = dtSrc.minute;
	mDDRet.second = dtSrc.second;

	return mDDRet;
}

//********************************************************************************

DBTIMESTAMP DBTSFromDBTime(DBTIME mDDRet)
{
	DBTIMESTAMP dtSrc;

	memset(&dtSrc, 0, sizeof(DBTIMESTAMP));

	dtSrc.hour = mDDRet.hour;
	dtSrc.minute = mDDRet.minute;
	dtSrc.second = mDDRet.second;

	return dtSrc;
}

//********************************************************************************

LPCTSTR GetDataTypeName(WORD dbtype)
{
	LPCTSTR mStr;

	switch(dbtype)
	{
	case  0:	//DBTYPE_EMPTY = 0,
		mStr = _T("Empty");
		break;
	case 1:		//DBTYPE_NULL = 1,
		mStr = _T("NULL");
		break;
	case 2:		//DBTYPE_I2 = 2,
		mStr = _T("Short");
		break;
	case 3:		//DBTYPE_I4 = 3,
		mStr = _T("Long");
		break;
	case 4:		//DBTYPE_R4 = 4,
		mStr = _T("Float");
		break;
	case 5:		//DBTYPE_R8 = 5,
		mStr = _T("Double");
		break;
	case 6:		//DBTYPE_CY = 6,
		mStr = _T("Currency");
		break;
	case 7:		//DBTYPE_DATE = 7,
		mStr = _T("Date");
		break;
	case 8:		//DBTYPE_BSTR = 8,
		mStr = _T("BSTR");
		break;
	case 9:		//DBTYPE_IDISPATCH = 9,
		mStr = _T("IDispatch Pointer");
		break;
	case 10:	//DBTYPE_ERROR = 10,
		mStr = _T("ErrorCode");
		break;
	case 11:	//DBTYPE_BOOL = 11,
		mStr = _T("Boolean");
		break;
	case 12:	//DBTYPE_VARIANT = 12,
		mStr = _T("Variant");
		break;
	case 13:	//DBTYPE_IUNKNOWN = 13,
		mStr = _T("IUnknown Pointer");
		break;
	case 14:	//DBTYPE_DECIMAL = 14,
		mStr = _T("Decimal");
		break;
	case 17:	//DBTYPE_UI1 = 17,
		mStr = _T("Byte");
		break;
	case 0x2000: //DBTYPE_ARRAY = 0x2000,
		mStr = _T("SafeArray");
		break;
	case 0x4000: //DBTYPE_BYREF = 0x4000,
		mStr = _T("void *");
		break;
	case 16:	//DBTYPE_I1 = 16,
		mStr = _T("Signed Char");
		break;
	case 18:	//DBTYPE_UI2 = 18,
		mStr = _T("USHORT");
		break;
	case 19:	//DBTYPE_UI4 = 19,
		mStr = _T("ULONG");
		break;
	case 20:	//DBTYPE_I8 = 20,
		mStr = _T("LARGE_INTEGER");
		break;
	case 21:	//DBTYPE_UI8 = 21,
		mStr = _T("Unsigned LARGE_INTEGER");
		break;
	case 72:	//DBTYPE_GUID = 72,
		mStr = _T("GUID");
		break;
	case 0x1000: //DBTYPE_VECTOR = 0x1000,
		mStr = _T("DBVECTOR");
		break;
	case 64:	//DBTYPE_FILETIME = 64,
		mStr = _T("FileTime");
		break;
	case 128:	//DBTYPE_BYTES = 128,
		mStr = _T("Byte Array");
		break;
	case 129:	//DBTYPE_STR = 129,
		mStr = _T("CHAR");
		break;
	case 130: //DBTYPE_WSTR = 130,
		mStr = _T("Unicode String");
		break;
	case 131: //DBTYPE_NUMERIC = 131,
		mStr = _T("Numeric");
		break;
	case 132: //DBTYPE_UDT = 132,
		mStr = _T("User-Defined Type");
		break;
	case 133: //DBTYPE_DBDATE = 133,
		mStr = _T("DBDATE");
		break;
	case 134: //DBTYPE_DBTIME = 134,
		mStr = _T("DBTIME");
		break;
	case 135: //DBTYPE_DBTIMESTAMP = 135
		mStr = _T("DBTIMESTAMP");
		break;
	case 136: //DBTYPE_HCHAPTER = 136
		mStr = _T("Chapter");
		break;
	case 138: //DBTYPE_PROPVARIANT = 138,
		mStr = _T("PROPVARIANT");
		break;
	case 139: //DBTYPE_VARNUMERIC = 139
		mStr = _T("VARNUMERIC");
		break;
	default:
		mStr = _T("");
	}

	return mStr; 
}

//********************************************************************************
/////////////////////  CSypODLError Object ////////////////////////////////
//********************************************************************************

CSypODLError::CSypODLError()
{
	mErrMsg = "";
	mErrLoc = "";
	mErrCtx = "";
}

//***********************************************

CSypODLError::~CSypODLError()
{

}

//***********************************************

CString CSypODLError::GetErrorMsg()
{
	return mErrMsg;
}

//***********************************************

CString CSypODLError::GetErrorLoc()
{
	return mErrLoc;
}

//***********************************************

CString CSypODLError::GetErrorCtx()
{
	return mErrCtx;
}

//***********************************************

void CSypODLError::ClearErrors()
{
	mErrMsg = "";
	mErrLoc = "";
	mErrCtx = "";
}

//***********************************************

void CSypODLError::SetError(CString msg, CString loc, CString ctx)
{
	mErrMsg = msg;
	mErrLoc = loc;
	mErrCtx = ctx;
}

//***********************************************

BOOL CSypODLConnection::Open(HWND hWnd)
{
	if(hWnd==NULL)hWnd=GetDesktopWindow();
	hr = m_db.Open(hWnd);
	if(FAILED(hr)){
		//MessageBox(adsw_hwndAcad,"设置连接信息失败",szParentWinText,MB_OK|MB_ICONERROR);
		m_db.Close();
		return FALSE;
	}
	hr = m_session.Open(m_db);

	char szParentWinText[200];
	memset(szParentWinText,0,200);
	GetWindowText(hWnd,szParentWinText,200);

	if(FAILED(hr)){
		MessageBox(hWnd,"打开连接失败,请重新设置数据连接",szParentWinText,MB_OK|MB_ICONERROR);
		return FALSE;
	}
	m_bIsOpen=TRUE;
	return TRUE;
}

BOOL CSypODLConnection::SetupConnectionString(HWND hWnd)
{
	char szWinSysDir[300];
	char szConnectionString[1000];
	char szParentWinText[200];
	memset(szWinSysDir,0,300);
	memset(szConnectionString,0,1000);
	memset(szParentWinText,0,200);

	
	//获取客户窗口标题...
	GetWindowText(hWnd,szParentWinText,200);

	CDataSource ds;
	HRESULT hr = ds.Open(hWnd);
	if(FAILED(hr)){
		//MessageBox(adsw_hwndAcad,"设置连接信息失败",szParentWinText,MB_OK|MB_ICONERROR);
		ds.Close();
		return FALSE;
	}
	
	//获取数据库连接字串后,关闭连接...
	CComBSTR bstr;
	ds.GetInitializationString(&bstr,true);
	ds.Close();

	_bstr_t bstrt=_bstr_t(bstr);
	strcpy(szConnectionString,(const char *)bstrt);
	
	//保存连接字串...
	GetSystemDirectory(szWinSysDir,300);
	strcat(szWinSysDir,"\\DbConnection.ini");
	ofstream of(szWinSysDir);
	of<<szConnectionString;
	of.close();
	return TRUE;
}

BOOL CSypODLConnection::OpenWithConnectionString(HWND hWnd)
{
	if(hWnd==NULL)hWnd=GetDesktopWindow();
	char szWinSysDir[300];
	memset(szWinSysDir,0,300);
	GetSystemDirectory(szWinSysDir,300);
	strcat(szWinSysDir,"\\DbConnection.ini");
	//判断连接字串文件是否已存在,不是则设置...
	OFSTRUCT ofs;
	memset(&ofs,0,sizeof(OFSTRUCT));
	ofs.cBytes=sizeof(OFSTRUCT);
	HFILE hf = OpenFile(szWinSysDir,&ofs,OF_EXIST);
	if(hf==HFILE_ERROR){
		SetupConnectionString(hWnd);
	}
	//读出连接字串内容,为打开连接作准备...
	memset(&ofs,0,sizeof(OFSTRUCT));
	ofs.cBytes=sizeof(OFSTRUCT);
	hf = OpenFile(szWinSysDir,&ofs,OF_READ);
	char szConnectionString[1000];
	DWORD dwReadedCount=0;
	memset(szConnectionString,0,1000);
	ReadFile((HANDLE)hf,szConnectionString,1000,&dwReadedCount,NULL);
	CloseHandle((HANDLE)hf);

	//打开连接...
	CComBSTR bstr(szConnectionString);
	hr = m_db.OpenFromInitializationString(bstr);
	//获取客户窗口标题...
	char szParentWinText[200];
	memset(szParentWinText,0,200);
	GetWindowText(hWnd,szParentWinText,200);

	hr = m_session.Open(m_db);
	if(FAILED(hr)){
		MessageBox(hWnd,"打开连接失败,请重新设置数据连接",szParentWinText,MB_OK|MB_ICONERROR);
		return FALSE;
	}
	m_bIsOpen=TRUE;
	return TRUE;
}

void CSypODLConnection::GetConnectString(char *szConnectionString)
{
	char szWinSysDir[300];
	memset(szWinSysDir,0,300);
	//MessageBox(0,szWinSysDir,"",0);//////////////空串/////////////////////
	GetSystemDirectory(szWinSysDir,300);
	strcat(szWinSysDir,"\\DbConnection.ini");
	//判断连接字串文件是否已存在,不是则设置...
	OFSTRUCT ofs;
	memset(&ofs,0,sizeof(OFSTRUCT));
	ofs.cBytes=sizeof(OFSTRUCT);
	HFILE hf = OpenFile(szWinSysDir,&ofs,OF_EXIST);
	if(hf==HFILE_ERROR){
		MessageBox(NULL,"请先设置数据库参数","SOUTH",0);
		//EchoOn();
		return;
	}
	//读出连接字串内容,为打开连接作准备...
	memset(&ofs,0,sizeof(OFSTRUCT));
	ofs.cBytes=sizeof(OFSTRUCT);
	hf = OpenFile(szWinSysDir,&ofs,OF_READ);
	DWORD dwReadedCount=0;
	ReadFile((HANDLE)hf,szConnectionString,1000,&dwReadedCount,NULL);
	CloseHandle((HANDLE)hf);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -