Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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));