Aracılığıyla paylaş


Önceki SQL Server Sürümleriyle Yeni Tarih ve Saat Özellikleri (OLE DB)

Şunlar için geçerlidir: Sql ServerAzure SQL VeritabanıAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Azure SQL Veritabanı

Bu konu, gelişmiş tarih ve saat özelliklerini kullanan bir istemci uygulamasının SQL Server 2008 (10.0.x) öncesi bir SQL Server sürümüyle iletişim kurması ve SQL Server 2008'den önceki (10.0.x) bir SQL Server Yerel İstemcisi sürümüyle derlenen bir istemcinin gelişmiş tarih ve saat özelliklerini destekleyen bir sunucuya komut göndermesi beklenen davranışı açıklar.

İstemci Davranışını Down-Level

SQL Server 2008 'den önceki (10.0.x) SQL Server Native Client sürümünü kullanan istemci uygulamaları, yeni tarih/saat türlerini nvarchar sütunları olarak görür. Sütun içeriği değişmez değer gösterimleridir. Daha fazla bilgi için OLE DB Tarih ve Saat geliştirmeleriiçin Veri Türü Desteği'nin "Veri Biçimleri: Dizeler ve Değişmez Değerler" bölümüne bakın. Sütun boyutu, sütun için belirtilen duyarlık için maksimum değişmez değer uzunluğudur.

Katalog API'leri, istemciye döndürülen alt düzey veri türü koduyla (örneğin, nvarchar) ve ilişkili alt düzey gösterimiyle (örneğin, uygun değişmez değer biçimi) tutarlı meta veriler döndürür. Ancak, döndürülen veri türü adı gerçek SQL Server 2008 (10.0.x) türü adı olacaktır.

Bir alt düzey istemci uygulaması, şemanın tarih/saat türlerine değiştirildiği SQL Server 2008 (10.0.x) (veya üzeri) sunucusunda çalıştırıldığında, beklenen davranış aşağıdaki gibidir:

OLE DB istemci türü SQL Server 2005 türü SQL Server 2008 (veya üzeri) türü Sonuç dönüştürme (sunucudan istemciye) Parametre dönüştürme (istemciden sunucuya)
DBTYPE_DBDATE Tarih saat Tarih TAMAM TAMAM
DBTYPE_DBTIMESTAMP Zaman alanları sıfır olarak ayarlanır. Zaman alanı sıfır değilse, IRowsetChange dize kesilmesi nedeniyle başarısız olur.
DBTYPE_DBTIME Saat(0) TAMAM TAMAM
DBTYPE_DBTIMESTAMP Tarih alanları geçerli tarihe ayarlanır. Kesirli saniyeler sıfır dışıysa IRowsetChange dize kesilmesi nedeniyle başarısız olur.

Tarih yoksayılır.
DBTYPE_DBTIME Saat(7) Başarısız oluyor - geçersiz zaman değişmez değeri. TAMAM
DBTYPE_DBTIMESTAMP Başarısız oluyor - geçersiz zaman değişmez değeri. TAMAM
DBTYPE_DBTIMESTAMP Datetime2(3) TAMAM TAMAM
DBTYPE_DBTIMESTAMP Datetime2(7) TAMAM TAMAM
DBTYPE_DBDATE Smalldatetime Tarih TAMAM TAMAM
DBTYPE_DBTIMESTAMP Zaman alanları sıfır olarak ayarlanır. Zaman alanı sıfır değilse IRowsetChange dize kesilmesi nedeniyle başarısız olur.
DBTYPE_DBTIME Saat(0) TAMAM TAMAM
DBTYPE_DBTIMESTAMP Tarih alanları geçerli tarihe ayarlanır. Kesirli saniyeler sıfır dışıysa IRowsetChange dize kesilmesi nedeniyle başarısız olur.

Tarih yoksayılır.
DBTYPE_DBTIMESTAMP Datetime2(0) TAMAM TAMAM

Tamam, SQL Server 2005 (9.x) ile çalıştıysa SQL Server 2008 (10.0.x) (veya üzeri) ile çalışmaya devam etmesi gerektiği anlamına gelir.

Yalnızca aşağıdaki yaygın şema değişiklikleri dikkate alınmıştır:

  • Mantıksal olarak bir uygulamanın yalnızca tarih veya saat değeri gerektirdiği yeni bir tür kullanma. Ancak, ayrı tarih ve saat türleri kullanılamadığından uygulama datetime veya smalldatetime kullanmaya zorlandı.

  • Ek kesirli saniye duyarlığı veya doğruluğu elde etmek için yeni bir tür kullanma.

  • Tarih ve saat için tercih edilen veri türü olduğundan datetime2 geçiş yapma.

ICommandWithParameters::GetParameterInfo veya şema satır kümeleri aracılığıyla alınan sunucu meta verilerini kullanarak ICommandWithParameters::SetParameterInfo aracılığıyla parametre türü bilgilerini ayarlayan uygulamalar, kaynak türün dize gösteriminin hedef türün dize gösteriminden daha büyük olduğu istemci dönüştürmeleri sırasında başarısız olur. Örneğin, istemci bağlaması DBTYPE_DBTIMESTAMP kullanıyorsa ve sunucu sütunu tarih ise, SQL Server Yerel İstemcisi değeri "yyyy-dd-mm hh:mm:ss.fff" değerine dönüştürür, ancak sunucu meta verilerinvarchar(10) olarak döndürülür. Sonuçta ortaya çıkan taşma DBSTATUS_E_CANTCONVERTVALUE neden olur. Satır kümesi meta verileri sonuç kümesi meta verilerinden ayarlandığından, IRowsetChange tarafından yapılan veri dönüştürmelerinde de benzer sorunlar ortaya çıkar.

Parametre ve Satır Kümesi Meta Verileri

Bu bölümde, SQL Server 2008 (10.0.x) öncesi bir SQL Server Yerel İstemci sürümüyle derlenen istemciler için parametreler, sonuç sütunları ve şema satır kümeleri için meta veriler açıklanmaktadır.

ICommandWithParameters::GetParameterInfo

DBPARAMINFO yapısı, prgParamInfo parametresi aracılığıyla aşağıdaki bilgileri döndürür:

Parametre türü wType ulParamSize bPrecision bScale
tarih DBTYPE_WSTR 10 ~0 ~0
Saat DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Bu değer aralıklarından bazılarının sürekli olmadığını; örneğin, 8,10..16 içinde 9 eksiktir. Bunun nedeni kesirli duyarlık sıfırdan büyük olduğunda ondalık noktanın eklenmesidir.

IColumnsRowset::GetColumnsRowset

Aşağıdaki sütunlar döndürülür:

Sütun türü DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
tarih DBTYPE_WSTR 10 SIFIR SIFIR
Saat DBTYPE_WSTR 8, 10..16 SIFIR SIFIR
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 SIFIR SIFIR
datetimeoffset DBTYPE_WSTR 26,28..34 SIFIR SIFIR

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO yapısı aşağıdaki bilgileri döndürür:

Parametre Türü wType ulColumnSize bPrecision bScale
tarih DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Şema Satır Kümeleri

Bu bölümde, yeni veri türleri için parametrelere, sonuç sütunlarına ve şema satır kümelerine yönelik meta veriler ele alınmaktadır. Bu bilgiler, SQL Server 2008 (10.0.x) SQL Server Native Client'dan önceki araçlar kullanılarak geliştirilmiş bir istemci sağlayıcınız olmasıdır.

COLUMNS Satır Kümesi

Tarih/saat türleri için aşağıdaki sütun değerleri döndürülür:

Sütun türü DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
tarih DBTYPE_WSTR 10 20 SIFIR
Saat DBTYPE_WSTR 8, 10..16 16,20..32 SIFIR
smalldatetime DBTYPE_DBTIMESTAMP SIFIR SIFIR 0
datetime DBTYPE_DBTIMESTAMP SIFIR SIFIR 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 SIFIR
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 SIFIR

Satır Kümesini PROCEDURE_PARAMETERS

Tarih/saat türleri için aşağıdaki sütun değerleri döndürülür:

Sütun türü DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
tarih DBTYPE_WSTR 10 20 tarih
Saat DBTYPE_WSTR 8, 10..16 16,20..32 Saat
smalldatetime DBTYPE_DBTIMESTAMP SIFIR SIFIR smalldatetime
datetime DBTYPE_DBTIMESTAMP SIFIR SIFIR datetime
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset

Satır Kümesini PROVIDER_TYPES

Tarih/saat türleri için aşağıdaki satırlar döndürülür:

Tür ->

Sütun
tarih Saat smalldatetime datetime datetime2 datetimeoffset
TYPE_NAME tarih Saat smalldatetime datetime datetime2 datetimeoffset
DATA_TYPE DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS SIFIR SIFIR SIFIR SIFIR SIFIR SIFIR
IS_NULLABLE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE
CASE_SENSITIVE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
ARANABİLİR DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE SIFIR SIFIR SIFIR SIFIR SIFIR SIFIR
FIXED_PREC_SCALE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
AUTO_UNIQUE_VALUE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
LOCAL_TYPE_NAME tarih Saat smalldatetime datetime datetime2 datetimeoffset
MINIMUM_SCALE SIFIR SIFIR SIFIR SIFIR SIFIR SIFIR
MAXIMUM_SCALE SIFIR SIFIR SIFIR SIFIR SIFIR SIFIR
GUID SIFIR SIFIR SIFIR SIFIR SIFIR SIFIR
TYPELIB SIFIR SIFIR SIFIR SIFIR SIFIR SIFIR
SÜRÜM SIFIR SIFIR SIFIR SIFIR SIFIR SIFIR
IS_LONG VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
BEST_MATCH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_TRUE VARIANT_FALSE VARIANT_FALSE
IS_FIXEDLENGTH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE

sunucu davranışını Down-Level

SQL Server 2008(10.0.x) sürümünden önceki bir sürümün sunucusuna bağlanıldığında, yeni sunucu türü adlarını (örneğin, ICommandWithParameters::SetParameterInfo veya ITableDefinition::CreateTable ile) kullanma girişimleri DB_E_BADTYPENAME sonuçlanır.

Yeni türler, tür adı kullanılmadan parametrelere veya sonuçlara bağlıysa ve sunucu türünü örtük olarak belirtmek için yeni tür kullanılırsa veya sunucu türünden istemci türüne geçerli bir dönüştürme yoksa, DB_E_ERRORSOCCURRED döndürülür ve DBBINDSTATUS_UNSUPPORTED_CONVERSION Yürüt'te kullanılan erişimci için bağlama durumu olarak ayarlanır.

Bağlantıdaki sunucu sürümü için arabellek türünden sunucu türüne desteklenen bir istemci dönüştürmesi varsa, tüm istemci arabellek türleri kullanılabilir. Bu bağlamda sunucu türü, ICommandWithParameters::SetParameterInfo tarafından belirtilen veya ICommandWithParameters::SetParameterInfo çağrılmadıysa arabellek türü tarafından belirtilen tür anlamına gelir. Başka bir deyişle, DBTYPE_DBTIME2 ve DBTYPE_DBTIMESTAMPOFFSET alt düzey sunucularla veya desteklenen bir sunucu türüne istemci dönüştürme başarılı olursa DataTypeCompatibility=80 ile kullanılabilir. Elbette, sunucu türü yanlışsa, gerçek sunucu türüne örtük bir dönüştürme gerçekleştiremezse sunucu tarafından yine de bir hata bildirilebilir.

SSPROP_INIT_DATATYPECOMPATIBILITY Davranışı

SSPROP_INIT_DATATYPECOMPATIBILITY SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 olarak ayarlandığında, yeni tarih/saat türleri ve ilişkili meta veriler, Gelişmiş Tarih ve Saat Türleri (OLE DB ve ODBC)için Değişiklikleri Toplu Kopyalama açıklandığı gibi, alt düzey istemciler için göründükleri şekilde istemcilere görünür.

IRowsetFind için Karşılaştırılabilirlik

Yeni tarih/saat türleri için tüm karşılaştırma işleçlerine izin verilir, çünkü bunlar tarih/saat türleri yerine dize türleri olarak görünür.

Ayrıca Bkz.

Tarih ve Saat Geliştirmeleri (OLE DB)