Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Bila Anda menggunakan pengandar Microsoft SQL Server ODBC dan Anda menggunakan SQLSetPos untuk memasukkan atau memperbarui nilai tanggal atau waktu yang berisi nilai-nilai maksimum diizinkan untuk jam, menit, kedua dan milidetik bagian (seperti 23:59:59:999 1999-10-03), masukkan pernyataan berhasil tapi salah nilai yang disimpan ke database.
Jika Anda mencoba untuk memilih ulang kembali nilai-nilai tanggal, pernyataan baik menghasilkan kesalahan atau kembali nilai-nilai salah, tergantung pada bagaimana bidang tanggal terikat. Jika bidang terikat sebagai SQL_C_TIMESTAMP, pesan kesalahan berikut terjadi:
SQLState = 22007 [Microsoft][ODBC SQL Server ODBC Driver]Format waktu tidak sah
Ketika lapangan terikat sebagai SQL_C_CHAR, tidak ada kesalahan terjadi; Namun, nilai-nilai yang tidak benar dikembalikan, seperti 1999-10-03 24:00:00.000. Ini dapat menghasilkan kesalahan dalam aplikasi menerima karena 24:00:00.000 tidak nilai tanggal berlaku.
Galat ini terjadi dengan Windows 2000/MDAC 2.5 membangun SQL Server ODBC driver (versi 3.70.820) dan sebelumnya.
Perbaikan terbaru yang didukung saat ini tersedia dari Microsoft, namun ini bertujuan hanya untuk memperbaiki masalah yang dijelaskan pada artikel ini. Gunakan hanya pada sistem yang mengalami masalah khusus ini. Hotfix ini akan menerima pengujian tambahan. Oleh karena itu, jika Anda sama sekali tidak dipengaruhi oleh masalah ini, kami menganjurkan Anda menunggu paket layanan Microsoft Data akses komponen yang berisi perbaikan terbaru ini.
Untuk segera memecahkan masalah ini, hubungi Layanan Dukungan Produk Microsoft untuk memperoleh perbaikan. Untuk daftar lengkap nomor telepon layanan dukungan produk Microsoft dan informasi mengenai biaya dukungan, kunjungi Website Microsoft berikut:
CATATAN: Dalam kasus tertentu, biaya yang biasanya diadakan untuk panggilan dukungan mungkin dibatalkan apabila teknisi dukungan Microsoft menentukan bahwa pembaruan khusus akan memecahkan masalah Anda. Biaya dukungan biasa akan dikenakan pada pertanyaan dan masalah dukungan tambahan yang tidak termasuk pada pembaruan tertentu yang dimaksud.
Versi bahasa Inggris untuk perbaikan ini harus memiliki atribut berkas berikut ini atau yang lebih tinggi:
Date Version Size File name
-----------------------------------------------------
04/04/00 3.70.0784 24,848 bytes Odbcbcp.dll
04/04/00 3.70.0784 516,368 bytes Sqlsrv32.dll
Berikut adalah dua cara potensial untuk masalah ini:
Jika mungkin, melakukan penyisipan dan pembaruan melalui pernyataan SQL langsung, yang kemudian memungkinkan SQL Server menangani konversi nilai-nilai tanggal.
-atau-
Jika penyimpanan milidetik tidak diperlukan, mendefinisikan bidang sebagai datatype smalldatetime bukannya datetime. Smalldatetime datatype hanya menggunakan 4 byte untuk penyimpanan, dan tidak mencakup milidetik presisi.
Berhenti aplikasi atau layanan yang menggunakan pengandar SQL Server ODBC, Sqlsrv32.dll. Ini mungkin termasuk Internet Information Server (IIS), Microsoft transaksi Server (MTS) dan aplikasi apapun ODBC, objek Data ActiveX Microsoft (ADO), atau OLE DB.
Men-download hotfix ke direktori sementara.
Menemukan dan mengubah nama versi terbaru dari Sqlsrv32.dll dan Odbcbcp.dll file, yang harus di folder \Winnt\System32 untuk komputer yang menjalankan Microsoft Windows NT, dan dalam folder \Windows\System untuk komputer yang menjalankan Microsoft Windows 95 dan Microsoft Windows 98.
Salin berkas perbaikan ke lokasi yang sama, dan kemudian restart layanan dan aplikasi.
Salin kode pada langkah 2 ke aplikasi konsol Microsoft Visual C++, dan kemudian kompilasi kode. Perlu diketahui bahwa Anda mungkin harus mengubah nama datasource, user id dan password.
Menjalankan kode, dan mencatat bahwa kesalahan terjadi ketika mengikat nilai tanggal sebagai SQL_C_TIMESTAMP, dan bahwa nilai tidak sah jam kembali ketika mengikat nilai tanggal sebagai SQL_C_CHAR.
#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#include <time.h>
void CreateTable(HSTMT);
main()
{
// ODBC handles
RETCODE rc;
HENV henv;
HDBC hdbc;
HSTMT hstmt;
// Variables for SQLConnect
char * dsn = "Pubs";
char * uid = "sa";
char * pwd = "";
// Variables for SQLDiagRec
char mstate[6] = "\0";
long native = 0;
char mtext[300] = "\0";
short mlength = 0;
short i = 0;
// Variables for SQLBindCol
int m_ID = 1;
long m_idLen = 4;
TIMESTAMP_STRUCT m_time = {1999,10,03,23,59,59,999000000};
char m_timeChar[30] = "\0";
long m_timeLen = 16;
long sqlnts = SQL_NTS;
// miscellaneous variables
char * strSQL = "Select * from MillisecTest";
char * strDropTable = "Drop table MillisecTest";
unsigned short status = 0;
unsigned long rowcount = 0;
// Allocate ODBC handles and connect
rc = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);
rc = SQLAllocHandle(SQL_HANDLE_DBC,henv, &hdbc);
rc = SQLConnect(hdbc, (unsigned char *)dsn,
SQL_NTS, (unsigned char *)uid,
SQL_NTS, (unsigned char *)pwd, SQL_NTS);
rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// Table creation
CreateTable(hstmt);
// Set statement attributes so SQLSetPos can be used
rc = SQLSetStmtAttr( hstmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER)SQL_CONCUR_LOCK, 0 );
rc = SQLSetStmtAttr( hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN, 0 );
// Bind the columns, using SQL_C_TIMESTAMP
rc = SQLBindCol(hstmt, 1, SQL_C_SHORT, &m_ID, 4, &m_idLen);
rc = SQLBindCol(hstmt, 2, SQL_C_TIMESTAMP, &m_time, sizeof(m_time), &m_timeLen);
// Execute the statement and use SQLSetPos to insert the date/time data
rc = SQLExecDirect(hstmt, (unsigned char *)strSQL, SQL_NTS);
rc = SQLExtendedFetch(hstmt, SQL_FETCH_NEXT, 1, &rowcount, &status );
rc = SQLSetPos(hstmt, 1, SQL_ADD, SQL_LOCK_NO_CHANGE);
SQLFreeStmt(hstmt, SQL_CLOSE);
memset(&m_time, 0, sizeof(m_time));
// Re-execute the statement, and attempt to fetch back the new date/time value
rc = SQLExecDirect(hstmt, (unsigned char *)strSQL, SQL_NTS);
rc = SQLExtendedFetch(hstmt, SQL_FETCH_NEXT, 1, &rowcount, &status );
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, (unsigned char *)&mstate, &native,
(unsigned char *)&mtext, 300, &mlength);
printf("\nError when attempting to bind as SQL_C_TIMESTAMP:\n\n");
printf("\tSQLSTATE\t%s\n\tNative Error\t%i\n\tMessage\t%s\n\n",mstate, native, mtext);
SQLFreeStmt(hstmt, SQL_CLOSE);
// Bind the date/time column as SQL_C_CHAR this time
rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, m_timeChar, sizeof(m_timeChar), &sqlnts);
rc = SQLExecDirect(hstmt, (unsigned char *)strSQL, SQL_NTS);
rc = SQLExtendedFetch(hstmt, SQL_FETCH_NEXT, 1, &rowcount, &status );
printf("\nInvalid hour when timestamp is bound as SQL_C_CHAR: %s\n\n", m_timeChar);
SQLFreeStmt(hstmt, SQL_CLOSE);
// Cleanup
SQLFreeStmt(hstmt, SQL_CLOSE);
SQLExecDirect(hstmt, (unsigned char *)strDropTable, SQL_NTS);
SQLFreeStmt(hstmt, SQL_CLOSE);
SQLFreeStmt(hstmt, SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
printf("\nDo the \"Press any key\" thing...");
getchar();
return(TRUE);
};
//------- CreateTable() ----------------
void CreateTable(HSTMT hstmt)
{
RETCODE rc = 0;
char SqlStatements[2][90] =
{"Drop table MillisecTest",
"Create table MillisecTest (ID integer constraint index1 PRIMARY KEY, TimeTest datetime)"};
rc = SQLExecDirect(hstmt, (unsigned char *)SqlStatements[0], SQL_NTS);
SQLFreeStmt(hstmt, SQL_CLOSE);
rc = SQLExecDirect(hstmt, (unsigned char *)SqlStatements[1], SQL_NTS);
SQLFreeStmt(hstmt, SQL_CLOSE);
}
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:259691
(http://support.microsoft.com/kb/259691/en-us/
)
Seberapa besar upaya Anda untuk menggunakan artikel ini?
Sangat sedikit
Sedikit
Sedang
Besar
Sangat besar
Berikan saran tentang apa yang dapat kami lakukan untuk menyempurnakan informasi ini
Terima kasih! Masukan Anda akan digunakan untuk membantu kami meningkatkan konten dukungan. Untuk opsi bantuan lainnya, kunjungi Halaman Beranda Bantuan dan Dukungan.