Dela via


SQL: SQL- och C++-datatyper (ODBC)

Anmärkning

Den här informationen gäller för MFC ODBC-klasserna. Om du arbetar med MFC DAO-klasserna läser du avsnittet "Jämförelse av Microsoft Jet Database Engine SQL och ANSI SQL" i DAO-hjälpen.

I följande tabell mappas ANSI SQL-datatyper till C++-datatyper. Detta utökar C-språkinformationen i bilaga D till ODBC-programmerarens referensdokumentation . Guiderna hanterar de flesta datatypsmappningar åt dig. Om du inte använder en guide kan du använda mappningsinformationen för att skriva fältutbyteskoden manuellt.

ANSI SQL-datatyper mappade till C++-datatyper

ANSI SQL-datatyp C++-datatyp
RÖDING CString
Decimal CString 1
SMALLINT int
VERKLIG float
HELTAL long
FLYTA double
DUBBEL double
NUMERISK CString 1
VARCHAR CString
LONGVARCHAR CLongBinary, CString 2
BIT BOOL
TINYINT BYTE
BIGINT CString 1
BINÄR CByteArray
VARBINARY CByteArray
LONGVARBINARY CLongBinary, CByteArray 3
DATUM CTime, CString
TID CTime, CString
TIDSSTÄMPEL CTime, CString
  1. ANSI DECIMAL och NUMERIC mappas till CString eftersom SQL_C_CHAR är standardtypen för ODBC-överföring.

  2. Teckendata över 255 tecken trunkeras som standard när de mappas till CString. Du kan utöka trunkeringslängden genom att uttryckligen ange argumentet nMaxLength för RFX_Text.

  3. Binära data över 255 tecken trunkeras som standard när de mappas till CByteArray. Du kan utöka trunkeringslängden genom att uttryckligen ange argumentet nMaxLength för RFX_Binary.

Om du inte använder ODBC-markörbiblioteket kan det uppstå ett problem när du försöker uppdatera två eller flera långa fält med variabel längd med hjälp av ODBC-drivrutinen för Microsoft SQL Server och MFC ODBC-databasklasserna. ODBC-typerna , SQL_LONGVARCHAR och SQL_LONGVARBINARY, mappar till SQL Server-typer för text och bild. En CDBException utlöses om du uppdaterar två eller flera långa fält med variabel längd på samma anrop till CRecordset::Update. Uppdatera därför inte flera långa kolumner samtidigt med CRecordset::Update. Du kan uppdatera flera kolumner med stor mängd data samtidigt med ODBC-API-et SQLPutData. Du kan också använda ODBC-markörbiblioteket, men detta rekommenderas inte för drivrutiner, till exempel SQL Server-drivrutinen, som stöder markörer och inte behöver markörbiblioteket.

Om du använder ODBC-markörbiblioteket med MFC ODBC-databasklasserna och Microsoft SQL Server ODBC-drivrutinen kan en ASSERT inträffa tillsammans med ett CDBException om ett anrop till CRecordset::Update följer ett anrop till CRecordset::Requery. Ring i stället CRecordset::Close och CRecordset::Open istället för CRecordset::Requery. En annan lösning är att inte använda ODBC-markörbiblioteket eftersom SQL Server- och SQL Server ODBC-drivrutinen ger internt stöd för markörer internt och ODBC-markörbiblioteket inte behövs.

Se även

SQL
SQL: Att göra direkta SQL-anrop (ODBC)