Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az alkalmazás minden puffert lefoglal és felszabadít. Ha a puffer nem halasztható el, csak a függvény hívásának idejére kell léteznie. Az SQLGetInfo például az InfoValuePtr argumentum által hivatkozott puffer adott beállításához társított értéket adja vissza. Ez a puffer közvetlenül az SQLGetInfo hívása után szabadítható fel, ahogy az alábbi kód példában is látható:
SQLSMALLINT InfoValueLen;
SQLCHAR * InfoValuePtr = malloc(50); // Allocate InfoValuePtr.
SQLGetInfo(hdbc, SQL_DBMS_NAME, (SQLPOINTER)InfoValuePtr, 50,
&InfoValueLen);
free(InfoValuePtr); // OK to free InfoValuePtr.
Mivel a halasztott pufferek az egyik függvényben vannak megadva, és egy másikban vannak használatban, az alkalmazás programozási hibája, hogy felszabadítsa a késleltetett puffert, miközben az illesztőprogram továbbra is azt várja, hogy létezni fog. A *ValuePtr puffer címét például az SQLFetch későbbi használatra átadja az SQLBindColnak. Ez a puffer csak akkor szabadítható fel, ha az oszlop nem kötetlen, például az SQLBindCol vagy az SQLFreeStmt hívásával, ahogyan az alábbi kód példában látható:
SQLRETURN rc;
SQLINTEGER ValueLenOrInd;
SQLHSTMT hstmt;
// Allocate ValuePtr
SQLCHAR * ValuePtr = malloc(50);
// Bind ValuePtr to column 1. It is an error to free ValuePtr here.
SQLBindCol(hstmt, 1, SQL_C_CHAR, ValuePtr, 50, &ValueLenOrInd);
// Fetch each row of data and place the value for column 1 in *ValuePtr.
// Code to check if rc equals SQL_ERROR or SQL_SUCCESS_WITH_INFO
// not shown.
while ((rc = SQLFetch(hstmt)) != SQL_NO_DATA) {
// It is an error to free ValuePtr here.
}
// Unbind ValuePtr from column 1. It is now OK to free ValuePtr.
SQLFreeStmt(hstmt, SQL_UNBIND);
free(ValuePtr);
Ez a hiba könnyen megoldható, ha a puffert helyileg deklaráljuk egy függvényben; a puffer felszabadul, amikor az alkalmazás elhagyja a függvényt. Az alábbi kód például nem definiált és valószínűleg végzetes viselkedést okoz az illesztőprogramban:
SQLRETURN rc;
SQLHSTMT hstmt;
BindAColumn(hstmt);
// Fetch each row of data and try to place the value for column 1 in
// *ValuePtr. Because ValuePtr has been freed, the behavior is undefined
// and probably fatal. Code to check if rc equals SQL_ERROR or
// SQL_SUCCESS_WITH_INFO not shown.
while ((rc = SQLFetch(hstmt)) != SQL_NO_DATA) {}
.
.
.
void BindAColumn(SQLHSTMT hstmt) // WARNING! This function won't work!
{
// Declare ValuePtr locally.
SQLCHAR ValuePtr[50];
SQLINTEGER ValueLenOrInd;
// Bind rgbValue to column.
SQLBindCol(hstmt, 1, SQL_C_CHAR, ValuePtr, sizeof(ValuePtr),
&ValueLenOrInd);
// ValuePtr is freed when BindAColumn exits.
}