catsets.cpp
上传用户:jsxglz
上传日期:2007-01-03
资源大小:117k
文件大小:3k
源码类别:

SQL Server

开发平台:

Visual C++

  1. // GetTypeInfo.cpp: implementation of the CGetTypeInfo class.
  2. //
  3. #include "stdafx.h"
  4. #include "catsets.h"
  5. /////////////////////////////////////////////////////////////////////////////
  6. // CGetTypeInfo
  7. CGetTypeInfo::CGetTypeInfo(CDatabase* pDatabase)
  8. : CRecordset(pDatabase)
  9. {
  10. m_strTypeName           = _T("");
  11. m_fDataType             = 0;
  12. m_nPrecision            = 0;
  13. m_strLiteralPrefix      = _T("");
  14. m_strLiteralSuffix      = _T("");
  15. m_strCreateParams       = _T("");
  16. m_fNullable             = 0;
  17. m_bCaseSensitive        = 0;
  18. m_fSearchable           = 0;
  19. m_fUnsignedAttribute    = 0;
  20. m_bMoney                = 0;
  21. m_fAutoIncrement        = 0;
  22. m_strLocalTypeName      = _T("");
  23. m_nMinimumScale         = 0;
  24. m_nMaximumScale         = 0;
  25. m_nFields = 15;
  26. }
  27. BOOL CGetTypeInfo::Open(short fSqlType, UINT nOpenType)
  28. {
  29. RETCODE nRetCode;
  30. UWORD   bFunctionExists;
  31. // make suer SQLGetTypeInfo exists
  32. AFX_SQL_SYNC(::SQLGetFunctions(m_pDatabase->m_hdbc,
  33. SQL_API_SQLGETTYPEINFO,&bFunctionExists));
  34. if (!Check(nRetCode) || !bFunctionExists)
  35. {
  36. if (!bFunctionExists)
  37. TRACE(_T("SQLGetTypeInfo not supportedn"));
  38. return FALSE;
  39. }
  40. // Cache state info and allocate hstmt
  41. SetState(nOpenType, NULL, readOnly);
  42. if(!AllocHstmt())
  43. return FALSE;
  44. TRY
  45. {
  46. OnSetOptions(m_hstmt);
  47. // Build SQL and prep/execute or just execute direct
  48. AllocStatusArrays();
  49. // call the ODBC function
  50. AFX_SQL_ASYNC(this,::SQLGetTypeInfo(m_hstmt,fSqlType));
  51. if (!Check(nRetCode))
  52. ThrowDBException(nRetCode,m_hstmt);
  53. // Allocate memory and cache info
  54. AllocAndCacheFieldInfo();
  55. AllocRowset();
  56. // Fetch the first row of data
  57. MoveNext();
  58. // If EOF, then result set empty, so set BOF as well
  59. m_bBOF = m_bEOF;
  60. }
  61. CATCH_ALL(e)
  62. {
  63. Close();
  64. THROW_LAST();
  65. }
  66. END_CATCH_ALL
  67. return TRUE;
  68. }
  69. void CGetTypeInfo::DoFieldExchange(CFieldExchange* pFX)
  70. {
  71. pFX->SetFieldType(CFieldExchange::outputColumn);
  72. RFX_Text(pFX, _T("TYPE_NAME"), m_strTypeName);
  73. RFX_Int(pFX, _T("DATA_TYPE"), m_fDataType);
  74. RFX_Long(pFX, _T("PRECISION"), m_nPrecision);
  75. RFX_Text(pFX, _T("LITERAL_PREFIX"), m_strLiteralPrefix);
  76. RFX_Text(pFX, _T("LITERAL_SUFFIX"), m_strLiteralSuffix);
  77. RFX_Text(pFX, _T("CREATE_PARAMS"), m_strCreateParams);
  78. RFX_Int(pFX, _T("NULLABLE"), m_fNullable);
  79. RFX_Int(pFX, _T("CASE_SENSITIVE"), m_bCaseSensitive);
  80. RFX_Int(pFX, _T("SEARCHABLE"), m_fSearchable);
  81. RFX_Int(pFX, _T("UNSIGNED_ATTRIBUTE"), m_fUnsignedAttribute);
  82. RFX_Int(pFX, _T("MONEY"), m_bMoney);
  83. RFX_Int(pFX, _T("AUTO_INCREMENT"), m_fAutoIncrement);
  84. RFX_Text(pFX, _T("LOCAL_TYPE_NAME"), m_strLocalTypeName);
  85. RFX_Int(pFX, _T("MINIMUM_SCALE"), m_nMinimumScale);
  86. RFX_Int(pFX, _T("MAXIMUM_SCALE"), m_nMaximumScale);
  87. }