Makale numarası: 259691 - Son Gözden Geçirme: 12 Ekim 2005 Çarşamba - Gözden geçirme: 4.4

Düzeltme: Hata iletisi "Geçersiz zaman biçimi" ne zaman, en büyük değerleri ile tarih/saat Ekle

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Belirtiler

Microsoft SQL Server ODBC sürücüsü kullanan ve SQLSetPos eklemek için kullandığınız veya saat, dakika, saniye ve milisaniye bölümleri (1999-10-03 23:59:59:999 gibi) izin verilen en yüksek değerleri içeren güncelleştirme tarih veya saat değerlerini, ekleme deyimi başarılı olur, ancak hatalı değerler veritabanına kaydedilir.

Yeniden denerseniz, tarih/saat değerlerini yedeklemek, deyim bir hata oluşturur veya tarih/saat alanı bağlı olduğu bağlı olarak, hatalı değerler verir. Alan bir SQL_C_TIMESTAMP bağlıysa, aşağıdaki hata iletisi oluşur:
SQLState 22007 =
[Microsoft][ODBC SQL Server ODBC sürücüsü]Geçersiz zaman biçimi
Alan bir SQL_C_CHAR bağlı olduğunda, hata oluşmaz; ancak, hatalı değerler, 1999-10-03 24:00:00.000 gibi döndürülür. 24:00:00.000 Geçerli tarih veya saat değeri olmadığından bu alıcı uygulamada hatalara neden olabilir.

Bu hata, Windows 2000/MDAC 2.5 yapı SQL Server ODBC sürücüsü (sürüm 3.70.820) ve önceki sürümleri ile ortaya çıkar.

Neden

Tarih/saat dönüştüren algoritması hata zaman içinde <a1>saat</a1> bölümüne tarihin gün kısmını alınıyor değil.

Çözüm

Desteklenen bir düzeltme Microsoft'tan edinilebilir, ancak yalnızca bu makalede anlatılan sorunu düzeltmesi amaçlanmıştır. Düzeltmeyi yalnızca bu sorunla karşılaşan sistemlere uygulayın. Bu düzeltmeye ek sınama uygulanabilir. Bu nedenle, bu sorundan ciddi bir şekilde etkilenmiyorsanız, bu düzeltmeyi içeren bir sonraki Microsoft Data Access Components hizmet paketini beklemenizi öneririz.

Bu sorunun derhal çözülmesini sağlayacak düzeltmeyi edinmek için Microsoft Ürün Destek Hizmetleri'ne başvurun. Microsoft Ürün Destek Hizmetleri'nin telefon numaralarının tam listesi ve destek ücretleriyle ilgili bilgi için, aşağıdaki Microsoft Web sitesini ziyaret edin:
http://support.microsoft.com/contactus/?ws=support (http://support.microsoft.com/contactus/?ws=support)
Not: Microsoft Destek Uzmanı özel bir güncelleştirmenin sorununuzu çözümleyeceğini belirlerse, destek aramaları için çözümleyeceğini giderler özel durumlarda, iptal edilebilir. Söz konusu güncelleştirme ile ilgili olmayan ek destek soruları ve sorunlar için normal destek ücretleri geçerlidir.



Bu düzeltmenin ingilizce sürümünde aşağıdaki dosya öznitelikleri olmalı veya daha yenisi:

   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

				




Geçici Çözüm

Aşağıda, bu sorunun iki olası geçici çözümler:
  • Olanaklıysa, ekler gerçekleştirmek ve tarih/saat değerleri dönüştürme yoluyla SQL Server'ı sağlayan doğrudan SQL deyimlerini, güncelleştirmelerin tanıtıcı.

    -VEYA-

  • Depolama milisaniye gerekli değilse, alan, yerine datetime, smalldatetime veri türü olarak tanımlayın. Smalldatetime veri türü yalnızca depolanmasında 4 bayt kullanır ve milisaniyesini duyarlık içermez.

Durum

Microsoft, bunun bu makalenin başında listelenen Microsoft ürünlerinde bir hata olduğunu onaylamıştır.

Daha fazla bilgi

Düzeltme dosyasını el ile yüklemesi

  1. Uygulamalar veya SQL Server ODBC sürücüsü (Sqlsrv32.dll kullanan hizmetler'nden çıkın. Bu, ınternet ınformation Server (IIS), Microsoft Transaction Server (MTS) ve herhangi bir ODBC, Microsoft ActiveX Data Objects (ADO) veya <a2>OLE DB uygulama içerebilir.
  2. Düzeltmeyi geçici bir dizine karşıdan yükleyin.
  3. Bulun ve geçerli sürümleri Microsoft Windows NT çalıştıran bilgisayarlar için <a1>\Winnt\System32</a1> klasöründe ve Microsoft Windows 95 ve Microsoft Windows 98 çalıştıran bilgisayarlar için \Windows\System klasöründe olması gereken Sqlsrv32.dll ve Odbcbcp.dll dosyalarını yeniden adlandırın.
  4. Düzeltme dosyaları aynı konuma kopyalayın ve sonra yeniden başlatın, Hizmetler ve uygulamalar.

Davranışı yeniden oluşturma adımları

  1. Adım 2'içine bir <a0>Microsoft Visual C++</a0> konsol uygulaması kodu kopyalamak ve sonra kodu derleyin. Veri kaynağı adı, kullanıcı kimliği ve parolayı değiştirmek gerekebileceğini unutmayın.
  2. Kodu çalıştırın ve tarih/saat değeri olarak SQL_C_TIMESTAMP bağlanırken bir hata oluştuğunu ve bir geçersiz saat değeri tarih/saat değeri olarak bir SQL_C_CHAR bağlanırken verdiğini unutmayın.
    #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);
    
    
    }
    					

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.1 Service Pack 1
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.5
  • Microsoft SQL Server 3.7 için Microsoft ODBC Sürücüsü
Anahtar Kelimeler: 
kbmt kbhotfixserver kbqfe kbbug kbcodesnippet kbdatabase kbfix kbmdac210sp2fix kbqfe KB259691 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:259691  (http://support.microsoft.com/kb/259691/en-us/ )