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.
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:
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
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.
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.
Düzeltmeyi geçici bir dizine karşıdan yükleyin.
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.
Düzeltme dosyaları aynı konuma kopyalayın ve sonra yeniden başlatın, Hizmetler ve uygulamalar.
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.
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);
}
Ö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/
)
Bu makaleyi kullanmak için ne kadar kişisel çaba harcadınız?
Çok az
Az
Orta
Fazla
Çok fazla
Bu bilgiyi geliştirmemiz için nedenleri ve bu konuda neler yapabileceğimizi paylaşın
Teşekkürler! Görüşleriniz, destek içeriğimizi geliştirmemize yardımcı olmak için kullanılmaktadır. Diğer yardım seçenekleri için, lütfen Yardım ve Destek Giriş Sayfasını ziyaret edin.