📄 sypodlobjects.cpp
字号:
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 + -