数据类型映射和注意事项
对于客户端与服务器同步,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 标识列的数据类型都必须为 int 或 bigint。SQL Server Compact 标识列的数据类型不能为 smallint、tinyint、decimal 或 numeric。有关标识列的更多信息,请参见为分布式环境选择适宜的主键。
在下载期间,计算列会复制到客户端数据库,但是不会复制计算列属性。建议您在双向同步和上载同步中不要使用计算列,因为在上载同步方案中插入操作可能会失败。若要避免此问题,可以不将这些列包括在用于检索数据的 SELECT 语句的 WHERE 子句中,从而将它们从数据集中筛选出去。有关筛选的更多信息,请参见如何筛选行和列。