数据类型映射和注意事项

对于客户端与服务器同步,Sync Framework 通过使用 ADO.NET 支持可以映射到 SQL Server Compact 3.5 SP1 中的有效数据类型的服务器数据类型。下表显示了默认情况下数据类型的映射方式。前两个表显示 ADO.NET 和 SQL Server Compact 之间的映射。第三个表显示 SQL Server 2008 和 SQL Server Compact 之间的映射。可以进行这些映射是因为两种版本的 SQL Server 共享许多相同的数据类型。如果应用程序需要不同的映射,请使用 SyncSchemaColumn 对象来映射类型。有关如何使用此对象的示例,请参见如何初始化客户端数据库和处理表架构

ADO.NET 和 SQL Server Compact 之间的映射

ADO.NET 数据类型 SQL Server Compact 数据类型

Boolean

bit

Byte

tinyint

Byte[]

varbinary

Char

nchar

DateTime

datetime

Decimal

numeric

Double

float

Int16

smallint

Int32

int

Int64

bigint

SByte

tinyint

Single

real

String

ntext

UInt16

smallint

UInt32

int

UInt64

bigint

SQL Server Compact 数据类型 ADO.NET 数据类型

bigint

Int64

binary

Byte[]

bit

Boolean

datetime

DateTime

float

Double

image

Byte[]

int

Int32

integer

Int32

money

Decimal

nchar

String

ntext

String

numeric

Decimal

nvarchar

String

real

Single

smallint

Int16

timestamp

Byte[]

tinyint

Byte

uniqueidentifier

Guid

varbinary

Byte[]

SQL Server 2008 和 SQL Server Compact 3.5 之间的映射

SQL Server 2008 数据类型 SQL Server Compact 3.5 SP1 数据类型

bigint

bigint

binary(n)

varbinary

bit

bit

char(n)

nchar(n)ntext

如果数据长度为 4,000 个字符或以下,则使用 nchar;否则使用 ntext

CLR 用户定义的类型

不支持。

date

“YYYY-MM-DD”形式的 nchar(27) 值 1

datetime

datetime

datetime2

“YYYY-MM-DD hh:mm:ss.nnnnnnn”形式的 nchar(27) 值 1

datetimeoffset

“YYYY-MM-DD hh:mm:ss.nnnnnnn [+/-] hh:mm”形式的 nvarchar(34) 值 1, 2

decimal

不支持;请使用 numeric

double

double

float

float

geography

不能由 Sync Framework 转换 3

geometry

不能由 Sync Framework 转换 3

hierarchyid

不能由 Sync Framework 转换 3

image

image

int

int

money

money

nchar(n)

nchar(n)

ntext

ntext

nvarchar(n)

nvarchar(n)

nvarchar(max)

ntext

如果数据的长度超出 ntext 列的长度,则同步失败。

numeric

numeric

real

real

smalldatetime

datetime

如果 datetime 数据的精度超出 smalldatetime 列的精度,则同步失败。

smallint

smallint

smallmoney

money

sql_variant

ntext

如果在 sql_variant 列中存在二进制数据,则该二进制数据必须为偶数个字节,否则会发生转换错误。

text

ntext

如果文本数据的长度超过 1,073,741,823 个字符,则同步失败。

time

“hh:mm:ss.nnnnnnn”形式的 nvarchar(16) 值 1

tinyint

tinyint

uniqueidentifier

uniqueidentifier

varbinary(n)

varbinary(n)

varbinary(max)

image

如果数据的长度超出 image 列的长度,则同步失败。

varchar(n)

nvarchar(n)ntext

如果数据长度为 4,000 个字符或以下,则使用 nvarchar;否则使用 ntext

varchar(max)

ntext

如果数据的长度超出 ntext 列的长度,则同步失败。

xml

ntext

1 对于这些日期和时间类型,请谨记以下事项:

  • 如果服务器提供程序位于运行 ADO.NET 2.0 的计算机上,将在服务器上转换这些类型。如果服务器提供程序位于运行 ADO.NET 2.0 SP1 的计算机上,这些类型将发送到客户端,并且随后在其上转换。

  • 客户端和服务器上对值的处理方式可能有所不同。例如,对于服务器上类型为 datetime2 的列,值“0001-01-01 00:00:00.0000000”和“0001-01-01 12:00 AM”是相同的。而在客户端上,这两个值被视为不同的字符串。此行为具有以下后果:

    • 不应在主键中使用这些类型的列。

    • 应该在客户端上将这些类型的列视为只读,除非应用程序能保证控制值的格式。

2 如果服务器提供程序位于运行 ADO.NET 2.0 SP1 的计算机上,客户端必须同时具备 ADO.NET 2.0 SP1,转换才能成功。.NET Compact Framework 2.0 SP1 或 .NET Compact Framework 3.5 不支持在客户端上自动转换 datetimeoffset

3 若要同步这些类型,可以使用 SyncSchemaColumn 对象在服务器上将其转换为 varbinary(max)image。有关如何使用此对象的示例,请参见如何初始化客户端数据库和处理表架构

映射注意事项

Sync Framework 在数据类型方面具有以下行为:

  • 不会从服务器中复制数据类型为 timestamp 的列中的数据。同步过程中,timestamp 列被映射到 binary(8) 数据类型。这是因为 timestamp 数据通常只有在创建它的数据库中才有意义。

  • ROWGUID 列从服务器复制到客户端数据库,但是不会复制 SQL Server ROWGUIDCOL 属性。有关如何设置此属性的示例,请参见如何初始化客户端数据库和处理表架构

  • 标识列从服务器复制到客户端数据库,但是标识种子和增量总是分别设置为 0 和 1。这是因为,无论这些属性在服务器数据库中设置为何值,SQL Server Compact 标识列的数据类型都必须为 intbigint。SQL Server Compact 标识列的数据类型不能为 smallinttinyintdecimalnumeric。有关标识列的更多信息,请参见为分布式环境选择适宜的主键

  • 在下载期间,计算列会复制到客户端数据库,但是不会复制计算列属性。建议您在双向同步和上载同步中不要使用计算列,因为在上载同步方案中插入操作可能会失败。若要避免此问题,可以不将这些列包括在用于检索数据的 SELECT 语句的 WHERE 子句中,从而将它们从数据集中筛选出去。有关筛选的更多信息,请参见如何筛选行和列

请参阅

概念

应用程序设计和部署注意事项