ID Artikel: 259691 - Kajian Terakhir: 21 September 2011 - Revisi: 2.0

FIX: Pesan kesalahan "Format waktu tidak sah" ketika Anda memasukkan tanggal dengan nilai-nilai maksimum

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.

Pada Halaman ini

Perbesar semua | Perkecil semua

GEJALA

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.

PENYEBAB

Kesalahan dalam algoritma yang mengubah tanggal/waktu tidak bergulir bagian jam waktu selama bagian hari tanggal.

PEMECAHAN MASALAH

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:
http://support.microsoft.com/contactus/?ws=support (http://support.microsoft.com/contactus/?ws=support)
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

				




Penyelesaian

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.

STATUS

Microsoft telah mengkonfirmasi bahwa ini adalah bug dalam produk Microsoft yang didaftar pada awal artikel ini.

INFORMASI LEBIH LANJUT

Instalasi manual berkas perbaikan terbaru

  1. 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.
  2. Men-download hotfix ke direktori sementara.
  3. 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.
  4. Salin berkas perbaikan ke lokasi yang sama, dan kemudian restart layanan dan aplikasi.

Langkah-langkah untuk mereproduksi perilaku

  1. 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.
  2. 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);
    
    
    }
    					

Berlaku bagi:
  • Microsoft Data Access Components 2.5
Kata kunci: 
kbhotfixserver kbqfe kbbug kbcodesnippet kbdatabase kbfix kbmdac210sp2fix kbmt KB259691 KbMtid
Penerjemahan MesinPenerjemahan Mesin
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/ )