SQL Server 2005 Native Client からのアプリケーションの更新

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

OLE DB ドライバーのダウンロード

この記事では、SQL Server 2005 (9.x) の SQL Server Native Client 以降の OLE DB Driver for SQL Server における破壊的変更について説明します。

Microsoft Data Access Components (MDAC) を OLE DB Driver for SQL Server にアップグレードした場合も、一部の動作で違いが生じます。 詳細については、「MDAC から OLE DB Driver for SQL Server へのアプリケーションの更新」を参照してください。

SQL Server 2005 (9.x) に付属する SQL Server Native Client 9.0。 SQL Server 2008 (10.0.x) に付属する SQL Server Native Client 10.0。 SQL Server 2008 R2 (10.50.x) に付属する SQL Server Native Client 10.5。 SQL Server および SQL Server 2012 (11.x) に付属する SQL Server 2014 (12.x) Native Client 11.0。

SQL Server 2005 (9.x) Native Client と比較して、OLE DB Driver for SQL Server で変更された動作 説明
OLE DB によって定義された有効桁数までしか埋め込まれない 変換後のデータがサーバーに送信される変換の場合、OLE DB Driver for SQL Server では、データの末尾の 0 は datetime 値の最大長までしか埋め込まれません。 SQL Server Native Client 9.0 では、9 桁まで埋め込まれていました。
ICommandWithParameter::SetParameterInfo の DBTYPE_DBTIMESTAMP が検証される。 OLE DB Driver for SQL Server では、ICommandWithParameter::SetParameterInfo の bScale を DBTYPE_DBTIMESTAMP の秒の小数部の有効桁数に設定するための OLE DB 要件が実装されています。
sp_columns ストアド プロシージャによって IS_NULLABLE 列に "NO " ではなく "NO" が返される。 OLE DB Driver for SQL Server では、sp_columns ストアド プロシージャによって IS_NULLABLE 列に "NO " ではなく "NO" が返されるようになりました。
日付が範囲外の場合に別のエラーが返される datetime 型では、範囲外の日付に対して OLE DB Driver for SQL Server によって返されるエラー番号が、前のバージョンで返されていたエラー番号と変わります。

具体的には、SQL Server Native Client 9.0 では、文字列から datetime への変換で年の値が範囲外の場合は 22007 が返されていました。OLE DB Driver for SQL Server では、日付が datetime2 でサポートされる範囲内でも、datetime または smalldatetime でサポートされる範囲外の場合、22008 が返されます。
丸め処理によって日が変わる場合に datetime 値では秒の小数部が丸められずに切り捨てられる。 SQL Server Native Client 10.0 より前のバージョンでは、サーバーに送信される datetime 値は、クライアントによって 1/300 秒単位に丸められていました。 OLE DB Driver for SQL Server では、丸め処理によって日が変わる場合、秒の小数部が切り捨てられます。
datetime 値の秒数が切り捨てられる可能性がある。 OLE DB Driver for SQL Server でビルドしたアプリケーションが SQL Server 2005 サーバーに接続する場合、型識別子を DBTYPE_DBTIMESTAMP (OLE DB) または SQL_TIMESTAMP (ODBC) に設定し、小数点以下桁数を 0 に設定して datetime 列にバインドすると、サーバーに送信されるデータの時刻部分の秒および秒の小数部が切り捨てられます。

次に例を示します。

入力データ: 1994-08-21 21:21:36.000

挿入されるデータ: 1994-08-21 21:21:00.000
DBTYPE_DBTIME から DBTYPE_DATE への OLE DB データ変換で日が変更されなくなる SQL Server Native Client 10.0 より前のバージョンでは、DBTYPE_DATE の時刻部分が午前 0 時から 0.5 秒以内の場合、OLE DB の変換コードによって日が変更されました。 OLE DB Driver for SQL Server では日付は変更されません (秒の小数部は丸められずに切り捨てられます)。
IBCPSession::BCColFmt の変換の変更。 OLE DB Driver for SQL Server で IBCPSession::BCOColFmt を使用して SQLDATETIME または SQLDATETIME を文字列型に変更すると、小数部の値がエクスポートされます。 たとえば、SQLDATETIME 型を SQLNVARCHARMAX 型に変換すると、SQL Server Native Client 10.0 より前のバージョンでは、
1989-02-01 00:00:00 が返されます。
OLE DB Driver for SQL Server では、
1989-02-01 00:00:00.0000000 が返されます。
BCP API を使用するカスタム アプリケーションで警告が表示される 指定されたフィールド長をデータ長が上回る場合、どの型の場合でも BCP API によって警告メッセージが生成されます。 以前のバージョンでは、この警告は、すべての型ではなく文字型についてのみ表示されました。
日付型または時刻型としてバインドされた sql_variant に空の文字列を挿入するとエラーが生成される。 SQL Server Native Client 9.0 では、日付型または時刻型としてバインドされた sql_variant に空の文字列を挿入してもエラーは生成されませんでした。 OLE DB Driver for SQL Server では、この場合に正しくエラーが生成されます。
SQL Server は、トリガーの実行時に異なる結果を返す場合がある SQL Server 2008 (10.0.x) で導入された変更により、NOCOUNT OFF が有効なときに、トリガーを実行させたステートメントからアプリケーションに返される結果が異なる可能性があります。 このような場合、アプリケーションでエラーが発生することがあります。 エラーを解決するには、トリガーに NOCOUNT ON を設定します。

関連項目

OLE DB Driver for SQL Server