📄 result.cpp
字号:
} case SQL_TINYINT: { SQLCHAR v; switch ( item_buf->GetType() ) { case eDB_TinyInt: outlen= xGetData(SQL_C_UTINYINT, &v, sizeof(SQLCHAR)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_TinyInt*) item_buf) = (Uint1) v; break; case eDB_SmallInt: outlen= xGetData(SQL_C_UTINYINT, &v, sizeof(SQLCHAR)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_SmallInt*) item_buf) = (Int2) v; break; case eDB_Int: outlen= xGetData(SQL_C_UTINYINT, &v, sizeof(SQLCHAR)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_Int*) item_buf) = (Int4) v; break; default: throw CDB_ClientEx(eDB_Error, 430020, "CODBC_*Result::GetItem", "Wrong type of CDB_Object"); } break; } case SQL_SMALLINT: { SQLSMALLINT v; switch ( item_buf->GetType() ) { case eDB_SmallInt: outlen= xGetData(SQL_C_SSHORT, &v, sizeof(SQLSMALLINT)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_SmallInt*) item_buf) = (Int2) v; break; case eDB_Int: outlen= xGetData(SQL_C_SSHORT, &v, sizeof(SQLSMALLINT)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_Int*) item_buf) = (Int4) v; break; default: throw CDB_ClientEx(eDB_Error, 430020, "CODBC_*Result::GetItem", "Wrong type of CDB_Object"); } break; } case SQL_INTEGER: { SQLINTEGER v; switch ( item_buf->GetType() ) { case eDB_Int: outlen= xGetData(SQL_C_SLONG, &v, sizeof(SQLINTEGER)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_Int*) item_buf) = (Int4) v; break; default: throw CDB_ClientEx(eDB_Error, 430020, "CODBC_*Result::GetItem", "Wrong type of CDB_Object"); } break; } case SQL_DOUBLE: case SQL_FLOAT: { SQLDOUBLE v; switch ( item_buf->GetType() ) { case eDB_Double: outlen= xGetData(SQL_C_DOUBLE, &v, sizeof(SQLDOUBLE)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_Double*) item_buf) = v; break; default: throw CDB_ClientEx(eDB_Error, 430020, "CODBC_*Result::GetItem", "Wrong type of CDB_Object"); } break; } case SQL_REAL: { SQLREAL v; switch ( item_buf->GetType() ) { case eDB_Float: outlen= xGetData(SQL_C_FLOAT, &v, sizeof(SQLREAL)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_Float*) item_buf) = v; break; default: throw CDB_ClientEx(eDB_Error, 430020, "CODBC_*Result::GetItem", "Wrong type of CDB_Object"); } break; } case SQL_BIGINT: case SQL_DECIMAL: case SQL_NUMERIC: { switch ( item_buf->GetType() ) { case eDB_Numeric: { SQL_NUMERIC_STRUCT v; SQLHDESC hdesc; SQLGetStmtAttr(m_Cmd, SQL_ATTR_APP_ROW_DESC,&hdesc, 0, NULL); SQLSetDescField(hdesc,m_CurrItem+1,SQL_DESC_TYPE,(VOID*)SQL_C_NUMERIC,0); SQLSetDescField(hdesc,m_CurrItem+1,SQL_DESC_PRECISION, (VOID*)(m_ColFmt[m_CurrItem].ColumnSize),0); SQLSetDescField(hdesc,m_CurrItem+1,SQL_DESC_SCALE, (VOID*)(m_ColFmt[m_CurrItem].DecimalDigits),0); outlen= xGetData(SQL_ARD_TYPE, &v, sizeof(SQL_NUMERIC_STRUCT)); if (outlen <= 0) item_buf->AssignNULL(); else xConvert2CDB_Numeric((CDB_Numeric*)item_buf, v); break; } case eDB_BigInt: { SQLBIGINT v; outlen= xGetData(SQL_C_SBIGINT, &v, sizeof(SQLBIGINT)); if (outlen <= 0) item_buf->AssignNULL(); else *((CDB_BigInt*) item_buf) = (Int8) v; break; } default: throw CDB_ClientEx(eDB_Error, 430020, "CODBC_*Result::GetItem", "Wrong type of CDB_Object"); } break; } case SQL_WLONGVARCHAR: case SQL_LONGVARBINARY: case SQL_LONGVARCHAR: { SQLINTEGER f; switch(item_buf->GetType()) { case eDB_Text: { CDB_Stream* val = (CDB_Stream*) item_buf; for(;;) { switch(SQLGetData(m_Cmd, m_CurrItem+1, SQL_C_CHAR, buffer, sizeof(buffer), &f)) { case SQL_SUCCESS_WITH_INFO: if(f == SQL_NO_TOTAL) f= sizeof(buffer) - 1; else if(f < 0) m_Reporter.ReportErrors(); case SQL_SUCCESS: if(f > 0) { if(f > sizeof(buffer)-1) f= sizeof(buffer)-1; val->Append(buffer, f); } continue; case SQL_NO_DATA: break; case SQL_ERROR: m_Reporter.ReportErrors(); default: throw CDB_ClientEx(eDB_Error, 430021, "CODBC_*Result::GetItem", "SQLGetData failed while retrieving text/image into CDB_Text"); } break; } break; } case eDB_Image: { CDB_Stream* val = (CDB_Stream*) item_buf; for(;;) { switch(SQLGetData(m_Cmd, m_CurrItem+1, SQL_C_BINARY, buffer, sizeof(buffer), &f)) { case SQL_SUCCESS_WITH_INFO: if(f == SQL_NO_TOTAL || f > sizeof(buffer)) f= sizeof(buffer); else m_Reporter.ReportErrors(); case SQL_SUCCESS: if(f > 0) { if(f > sizeof(buffer)) f= sizeof(buffer); val->Append(buffer, f); } continue; case SQL_NO_DATA: break; case SQL_ERROR: m_Reporter.ReportErrors(); default: throw CDB_ClientEx(eDB_Error, 430022, "CODBC_*Result::GetItem", "SQLGetData failed while retrieving text/image into CDB_Image"); } break; } break; } default: throw CDB_ClientEx(eDB_Error, 430020, "CODBC_*Result::GetItem", "Wrong type of CDB_Object"); } break; } default: throw CDB_ClientEx(eDB_Error, 430025, "CODBC_*Result::GetItem", "Unsupported column type"); } return item_buf;}CDB_Object* CODBC_RowResult::xMakeItem(){ char buffer[8*1024]; int outlen; switch(m_ColFmt[m_CurrItem].DataType) { case SQL_WCHAR: case SQL_CHAR: case SQL_VARCHAR: case SQL_WVARCHAR: { outlen= xGetData(SQL_C_CHAR, buffer, sizeof(buffer)); if(m_ColFmt[m_CurrItem].ColumnSize < 256) { CDB_VarChar* val = (outlen < 0) ? new CDB_VarChar() : new CDB_VarChar(buffer, (size_t) outlen); return val; } else { CDB_LongChar* val = (outlen < 0) ? new CDB_LongChar(m_ColFmt[m_CurrItem].ColumnSize) : new CDB_LongChar(m_ColFmt[m_CurrItem].ColumnSize, buffer); return val; } } case SQL_BINARY: case SQL_VARBINARY: { outlen= xGetData(SQL_C_BINARY, buffer, sizeof(buffer)); if(m_ColFmt[m_CurrItem].ColumnSize < 256) { CDB_VarBinary* val = (outlen <= 0) ? new CDB_VarBinary() : new CDB_VarBinary(buffer, (size_t)outlen); return val; } else { CDB_LongBinary* val = (outlen < 0) ? new CDB_LongBinary(m_ColFmt[m_CurrItem].ColumnSize) : new CDB_LongBinary(m_ColFmt[m_CurrItem].ColumnSize, buffer, (size_t) outlen); return val; } } case SQL_BIT: { SQLCHAR v; outlen= xGetData(SQL_C_BIT, &v, sizeof(SQLCHAR)); return (outlen <= 0) ? new CDB_Bit() : new CDB_Bit((int) v); } case SQL_TYPE_TIMESTAMP: { SQL_TIMESTAMP_STRUCT v; outlen= xGetData(SQL_C_TYPE_TIMESTAMP, &v, sizeof(SQL_TIMESTAMP_STRUCT)); if (outlen <= 0) { return new CDB_SmallInt(); } else { CTime t((int)v.year, (int)v.month, (int)v.day, (int)v.hour, (int)v.minute, (int)v.second, (long)v.fraction); return new CDB_DateTime(t); } } case SQL_TINYINT: { SQLCHAR v; outlen= xGetData(SQL_C_UTINYINT, &v, sizeof(SQLCHAR)); return (outlen <= 0) ? new CDB_TinyInt() : new CDB_TinyInt((Uint1) v); } case SQL_SMALLINT: { SQLSMALLINT v; outlen= xGetData(SQL_C_SSHORT, &v, sizeof(SQLSMALLINT)); return (outlen <= 0) ? new CDB_SmallInt() : new CDB_SmallInt((Int2) v); } case SQL_INTEGER: { SQLINTEGER v; outlen= xGetData(SQL_C_SLONG, &v, sizeof(SQLINTEGER)); return (outlen <= 0) ? new CDB_Int() : new CDB_Int((Int4) v); } case SQL_DOUBLE: case SQL_FLOAT: { SQLDOUBLE v; outlen= xGetData(SQL_C_DOUBLE, &v, sizeof(SQLDOUBLE)); return (outlen <= 0) ? new CDB_Double() : new CDB_Double(v); } case SQL_REAL: { SQLREAL v; outlen= xGetData(SQL_C_FLOAT, &v, sizeof(SQLREAL)); return (outlen <= 0) ? new CDB_Float() : new CDB_Float(v); } case SQL_DECIMAL: case SQL_NUMERIC: { if((m_ColFmt[m_CurrItem].DecimalDigits > 0) || (m_ColFmt[m_CurrItem].ColumnSize > 20)) { // It should be numeric SQL_NUMERIC_STRUCT v; outlen= xGetData(SQL_C_NUMERIC, &v, sizeof(SQL_NUMERIC_STRUCT)); CDB_Numeric* r= new CDB_Numeric; if(outlen > 0) { xConvert2CDB_Numeric(r, v); } return r; } else { // It should be bigint SQLBIGINT v; outlen= xGetData(SQL_C_SBIGINT, &v, sizeof(SQLBIGINT)); return (outlen <= 0) ? new CDB_BigInt() : new CDB_BigInt((Int8) v); } } case SQL_WLONGVARCHAR: case SQL_LONGVARCHAR: { CDB_Text* val = new CDB_Text; SQLINTEGER f; for(;;) { switch(SQLGetData(m_Cmd, m_CurrItem+1, SQL_C_CHAR, buffer, sizeof(buffer), &f)) { case SQL_SUCCESS_WITH_INFO: if(f == SQL_NO_TOTAL) f= sizeof(buffer) - 1; else if(f < 0) m_Reporter.ReportErrors(); case SQL_SUCCESS: if(f > 0) { if(f > sizeof(buffer)-1) f= sizeof(buffer)-1; val->Append(buffer, f); } continue; case SQL_NO_DATA: break; case SQL_ERROR: m_Reporter.ReportErrors(); default: throw CDB_ClientEx(eDB_Error, 430023, "CODBC_*Result::GetItem", "SQLGetData failed while retrieving text into CDB_Text"); } } return val; } case SQL_LONGVARBINARY: { CDB_Image* val = new CDB_Image; SQLINTEGER f; for(;;) { switch(SQLGetData(m_Cmd, m_CurrItem+1, SQL_C_BINARY, buffer, sizeof(buffer), &f)) { case SQL_SUCCESS_WITH_INFO: if(f == SQL_NO_TOTAL) f= sizeof(buffer); else if(f < 0) m_Reporter.ReportErrors(); case SQL_SUCCESS: if(f > 0) { if(f > sizeof(buffer)) f= sizeof(buffer); val->Append(buffer, f); } continue; case SQL_NO_DATA: break; case SQL_ERROR: m_Reporter.ReportErrors(); default: throw CDB_ClientEx(eDB_Error, 430024, "CODBC_*Result::GetItem", "SQLGetData failed while retrieving image into CDB_Image"); } } return val; } default: throw CDB_ClientEx(eDB_Error, 430025, "CODBC_*Result::GetItem",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -