データ型のマッピングと注意点
クライアントとサーバーの同期の場合、Sync Framework は、ADO.NET を使用することで、SQL Server Compact 3.5 SP1 の有効なデータ型にマップできるサーバーのデータ型をサポートします。次の表に、既定でどのように型がマップされるかを示します。最初の 2 つのテーブルは、ADO.NET と SQL Server Compact の間のマッピングを示します。3 番目のテーブルは、SQL Server 2008 と SQL Server Compact の間のマッピングを示します。これらのマッピングが可能なのは、SQL Server の 2 つのバージョン間で同じデータ型が多数共有されるためです。アプリケーションで異なるマッピングが必要な場合は、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 |
nchar(27) 値 ('YYYY-MM-DD' 形式)1 |
datetime |
datetime |
datetime2 |
nchar(27) 値 ('YYYY-MM-DD hh:mm:ss.nnnnnnn' 形式)1 |
datetimeoffset |
nvarchar(34) 値 ('YYYY-MM-DD hh:mm:ss.nnnnnnn [+/-] hh:mm' 形式)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 |
nvarchar(16) 値 ('hh:mm:ss.nnnnnnn' 形式)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 が利用可能である必要があります。クライアント上での datetimeoffset の自動変換は、.NET Compact Framework 2.0 SP1 または .NET Compact Framework 3.5 でサポートされていません。
3 これらの型を同期するには、サーバー上で SyncSchemaColumn オブジェクトを使用して varbinary(max) または image に変換します。このオブジェクトの使用例については、「クライアント データベースを初期化してテーブル スキーマを操作する方法」を参照してください。
マッピングに関する注意点
Sync Framework では、データ型に関して次の動作が見られます。
timestamp データ型の列のデータは、サーバーからコピーされません。timestamp 列は同期中に binary(8) データ型にマップされます。これは、timestamp 型のデータは、通常、このデータが作成されたデータベースのみで意味を持つためです。
ROWGUID 列はサーバーからクライアント データベースにコピーされますが、SQL Server の ROWGUIDCOL プロパティはコピーされません。このプロパティの設定方法の例については、「クライアント データベースを初期化してテーブル スキーマを操作する方法」を参照してください。
ID 列はサーバーからクライアント データベースにコピーされますが、IDENTITY シードと IDENTITY インクリメントはそれぞれ、常に、0 および 1 に設定されます。これは、サーバー データベースでのプロパティの設定方法に関係ありません。SQL Server Compact の ID 列のデータ型は、int または bigint である必要があります。SQL Server Compact の ID 列のデータ型は、smallint、tinyint、decimal、または numeric にすることはできません。ID 列の詳細については、「分散環境に適切な主キーの選択」を参照してください。
計算列はダウンロード中にクライアント データベースにコピーされますが、計算列のプロパティはコピーされません。アップロード時に挿入操作が失敗する可能性があるため、双方向とアップロードのシナリオでは計算列を使用しないことをお勧めします。この問題を回避するには、データセットから計算列を除外します。これには、データを取得する際に使用する SELECT ステートメントの WHERE 句に計算列を含めないようにします。フィルター選択の詳細については、「行および列をフィルター選択する方法」を参照してください。