|
|
| version 1.6, 2002/03/05 15:04:59 | version 1.7, 2002/04/25 17:51:38 |
|---|---|
| Line 21 static const char *RCSId="$Id$"; | Line 21 static const char *RCSId="$Id$"; |
| #include <AFXDB.H> | #include <AFXDB.H> |
| #define MAX_STRING 0x400 | #define MAX_STRING 0x400 |
| #define MAX_NUMBER 40 | |
| // MSSQL2000 | |
| #ifndef SQL_NVARCHAR | |
| #define SQL_NVARCHAR (-9) | |
| #endif | |
| #ifndef SQL_NTEXT | |
| #define SQL_NTEXT (-10) | |
| #endif | |
| #ifndef SQL_SMALLDATETIME | |
| #define SQL_SMALLDATETIME 11 | |
| #endif | |
| // create table test (id int, a smalldatetime, b ntext, c nvarchar(100)) | |
| #define snprintf _snprintf | #define snprintf _snprintf |
| #ifndef strncasecmp | #ifndef strncasecmp |
| Line 167 public: | Line 180 public: |
| if(row>=offset) { | if(row>=offset) { |
| handlers.add_row(); | handlers.add_row(); |
| for(int i=0; i<column_count; i++) { | for(int i=0; i<column_count; i++) { |
| CString string; | CODBCFieldInfo fieldinfo; |
| rs.GetFieldValue(i, string); | rs.GetODBCFieldInfo(i, fieldinfo); |
| size_t size; | size_t size; |
| void *ptr; | void *ptr; |
| if(string.IsEmpty()) { | switch(fieldinfo.m_nSQLType) { |
| ptr=0; | //case xBOOL: |
| size=0; | // case SQL_INTEGER: // serg@design.ru did that in parser2. test first! |
| } else { | //case SQL_DATETIME: |
| const char *string_cstr=LPCTSTR(string); | case SQL_SMALLDATETIME: |
| size=strlen(string_cstr); //string.GetLength() works wrong with non-string types: | { |
| ptr=services.malloc(size); | CDBVariant v; |
| memcpy(ptr, string_cstr, size); | rs.GetFieldValue(i, v); |
| getFromDBVariant(services, v, ptr, size); | |
| break; | |
| } | |
| default: | |
| { | |
| CString s; | |
| rs.GetFieldValue(i, s); | |
| getFromString(services, s, ptr, size); | |
| break; | |
| } | |
| } | } |
| handlers.add_row_cell(ptr, size); | handlers.add_row_cell(ptr, size); |
| } | } |
| Line 197 public: | Line 220 public: |
| END_CATCH_ALL | END_CATCH_ALL |
| } | } |
| void getFromDBVariant(SQL_Driver_services& services, CDBVariant& v, void *& ptr, size_t& size) { | |
| switch(v.m_dwType) { | |
| case DBVT_NULL: // No union member is valid for access. | |
| ptr=0; | |
| size=0; | |
| break; | |
| /* case DBVT_BOOL: | |
| ptr=v.m_boolVal?"1":"0"; | |
| size=1; | |
| break;*/ | |
| /* case DBVT_UCHAR: | |
| size=strlen(ptr=v.m_chVal); | |
| break; | |
| case DBVT_SHORT: | |
| char buf[MAX_NUMBER]; | |
| size=snprintf(HEAPIZE buf, "%d", v.m_iVal); | |
| break;*/ | |
| /* case DBVT_LONG: | |
| { | |
| char local_buf[MAX_NUMBER]; | |
| size=snprintf(local_buf, MAX_NUMBER, "%ld", v.m_lVal); | |
| ptr=services.malloc(size); | |
| memcpy(ptr, local_buf, size); | |
| break; | |
| }*/ | |
| /*case DBVT_SINGLE: | |
| m_fltVal | |
| break; | |
| case DBVT_DOUBLE m_dblVal | |
| case DBVT_STRING m_pstring | |
| case DBVT_BINARY m_pbinary */ | |
| case DBVT_DATE: | |
| { | |
| char local_buf[MAX_STRING]; | |
| size=snprintf(local_buf, MAX_STRING, | |
| "%04d-%02d-%02d %02d:%02d:%02d.%03d", | |
| v.m_pdate->year, | |
| v.m_pdate->month, | |
| v.m_pdate->day, | |
| v.m_pdate->hour, | |
| v.m_pdate->minute, | |
| v.m_pdate->second, | |
| v.m_pdate->fraction); | |
| ptr=services.malloc(size); | |
| memcpy(ptr, local_buf, size); | |
| break; | |
| } | |
| default: | |
| char msg[MAX_STRING]; | |
| snprintf(msg, MAX_STRING, "unknown column return variant type (%d)", | |
| v.m_dwType); | |
| services._throw(msg); | |
| } | |
| } | |
| void getFromString(SQL_Driver_services& services, CString& s, void *& ptr, size_t& size) { | |
| if(s.IsEmpty()) { | |
| ptr=0; | |
| size=0; | |
| } else { | |
| const char *cstr=LPCTSTR(s); | |
| size=strlen(cstr); //string.GetLength() works wrong with non-string types: | |
| ptr=services.malloc(size); | |
| memcpy(ptr, cstr, size); | |
| } | |
| } | |
| void _throw(SQL_Driver_services& services, CException *e) { | void _throw(SQL_Driver_services& services, CException *e) { |
| char szCause[MAX_STRING]; szCause[0]=0; | char szCause[MAX_STRING]; szCause[0]=0; |
| e->GetErrorMessage(szCause, MAX_STRING); | e->GetErrorMessage(szCause, MAX_STRING); |