SQL ke C: Numerik
Pengidentifikasi untuk jenis data ODBC SQL numerik adalah sebagai berikut:
- SQL_DECIMAL
- SQL_BIGINT
- SQL_NUMERIC
- SQL_REAL
- SQL_TINYINT
- SQL_FLOAT
- SQL_SMALLINT
- SQL_DOUBLE SQL_INTEGER
Tabel berikut ini memperlihatkan tipe data ODBC C tempat data SQL numerik dapat dikonversi. Untuk penjelasan tentang kolom dan istilah dalam tabel, lihat Mengonversi Data dari SQL ke Jenis Data C.
Pengidentifikasi tipe C | Uji | *TargetValuePtr | *StrLen_or_IndPtr | SQLSTATE |
---|---|---|---|---|
SQL_C_CHAR | Panjang byte karakter <BufferLength Jumlah keseluruhan (dibandingkan dengan digit <pecahan) BufferLength Jumlah digit keseluruhan (dibandingkan dengan pecahan) >= BufferLength |
Data Data terpotong Tidak terdefinisi |
Panjang data dalam byte Panjang data dalam byte Tidak terdefinisi |
n/a 01004 22003 |
SQL_C_WCHAR | Panjang karakter <BufferLength Jumlah keseluruhan (dibandingkan dengan digit <pecahan) BufferLength Jumlah digit keseluruhan (dibandingkan dengan pecahan) >= BufferLength |
Data Data terpotong Tidak terdefinisi |
Panjang data dalam karakter Panjang data dalam karakter Tidak terdefinisi |
n/a 01004 22003 |
SQL_C_STINYINT SQL_C_UTINYINT SQL_C_TINYINT SQL_C_SBIGINT SQL_C_UBIGINT SQL_C_SSHORT SQL_C_USHORT SQL_C_SHORT SQL_C_SLONG SQL_C_ULONG SQL_C_LONG SQL_C_NUMERIC |
Data dikonversi tanpa pemotongan[a] Data dikonversi dengan pemotongan digit pecahan[a] Konversi data akan mengakibatkan hilangnya digit keseluruhan (dibandingkan dengan pecahan) digit[a] |
Data Data terpotong Tidak terdefinisi |
Ukuran tipe data C Ukuran tipe data C Tidak terdefinisi |
n/a 01S07 22003 |
SQL_C_FLOAT SQL_C_DOUBLE |
Data berada dalam rentang jenis data yang angkanya sedang dikonversi[a] Data berada di luar rentang tipe data tempat angka sedang dikonversi[a] |
Data Tidak terdefinisi |
Ukuran tipe data C Tidak terdefinisi |
n/a 22003 |
SQL_C_BIT | Data adalah 0 atau 1[a] Data lebih besar dari 0, kurang dari 2, dan tidak sama dengan 1[a] Data kurang dari 0 atau lebih besar dari atau sama dengan 2[a] |
Data Data terpotong Tidak terdefinisi |
1[b] 1[b] Tidak terdefinisi |
n/a 01S07 22003 |
SQL_C_BINARY | Panjang byte data <= BufferLength Panjang byte data >BufferLength |
Data Tidak terdefinisi |
Panjang data Tidak terdefinisi |
n/a 22003 |
SQL_C_INTERVAL_MONTH[c] SQL_C_INTERVAL_YEAR[c] SQL_C_INTERVAL_DAY[c] SQL_C_INTERVAL_HOUR[c] SQL_C_INTERVAL_MINUTE[c] SQL_C_INTERVAL_SECOND[c] | Data tidak terpotong Bagian detik pecahan terpotong Seluruh bagian dari angka terpotong |
Data Data terpotong Tidak terdefinisi |
Panjang data dalam byte Panjang data dalam byte Tidak terdefinisi |
n/a 01S07 22015 |
SQL_C_INTERVAL_YEAR_TO_MONTH SQL_C_INTERVAL_DAY_TO_HOUR SQL_C_INTERVAL_DAY_TO_MINUTE SQL_C_INTERVAL_DAY_TO_SECOND SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_C_INTERVAL_HOUR_TO_SECOND | Seluruh bagian dari angka terpotong | Tidak terdefinisi | Tidak terdefinisi | 22015 |
[a] Nilai BufferLength diabaikan untuk konversi ini. Driver mengasumsikan bahwa ukuran *TargetValuePtr adalah ukuran jenis data C.
[b] Ini adalah ukuran jenis data C yang sesuai.
[c] Konversi ini hanya didukung untuk jenis data numerik yang tepat (SQL_DECIMAL, SQL_NUMERIC, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, dan SQL_BIGINT). Ini tidak didukung untuk perkiraan jenis data numerik (SQL_REAL, SQL_FLOAT, atau SQL_DOUBLE).
SQL_C_NUMERIC dan SQLSetDescField
Fungsi SQLSetDescField diperlukan untuk melakukan pengikatan manual dengan nilai SQL_C_NUMERIC. (Perhatikan bahwa SQLSetDescField ditambahkan di ODBC 3.0.) Untuk melakukan pengikatan manual, Anda harus terlebih dahulu mendapatkan handel deskriptor.
if (fCType == SQL_C_NUMERIC) {
// special processing required for NUMERIC to get right scale & precision
// Modify the fields in the implicit application parameter descriptor
SQLHDESC hdesc=NULL;
// Use SQL_ATTR_APP_ROW_DESC for calls to SQLBindCol()
// Use SQL_ATTR_APP_PARAM_DESC for calls to SQLBindParameter()
//
// retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_ROW_DESC, &hdesc, 0, NULL);
retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_PARAM_DESC, &hdesc, 0, NULL);
if (!ODBC_CALL_SUCCESS(retcode)) {
printf ("\nSQLGetStmtAttr failed");
i = 1;
sqlstate[7] = '\0';
while (SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, sqlstate, &NativeError, wrkbuf, sizeof(wrkbuf), &len) != SQL_NO_DATA) {
printf("\niTestCase = %d Failed...Precision = %d, Scale = %d\nNativeError=%d, State=%s, \n Message=%s",
iTestCase, Precision, Scale, NativeError, sqlstate, wrkbuf);
i++;
}
continue;
}
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_TYPE, (SQLPOINTER) SQL_C_NUMERIC, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_PRECISION, (SQLPOINTER)num.precision, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_SCALE, (SQLPOINTER)num.scale, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_DATA_PTR, (SQLPOINTER) &(num), sizeof(num));