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

このトピックでは、SQL Server 2005 の SQL Server Native Client 以降の SQL Server Native Client における重大な変更について説明します。

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

SQL Server 2005 に付属する SQL Server Native Client 9.0。 SQL Server 2008 に付属する SQL Server Native Client 10.0。 SQL Server 2008 R2 に付属する SQL Server Native Client 10.5。 SQL Server 2012 に付属する SQL Server Native Client 11.0。

SQL Server 2005 以降の SQL Server Native Client で変更された動作

説明

OLE DB によって定義された有効桁数までしか埋め込まれない

変換後のデータがサーバーに送信される変換の場合、SQL Server Native Client (SQL Server 2008 以降) では、データの末尾の 0 は datetime 値の最大長までしか埋め込まれません。 SQL Server Native Client 9.0 では、9 桁まで埋め込まれていました。

ICommandWithParameter::SetParameterInfo について DBTYPE_DBTIMESTAMP を検証する

SQL Server Native Client (SQL Server 2008 以降) では OLE DB 要件が実装され、ICommandWithParameter::SetParameterInfo の bScale に DBTYPE_DBTIMESTAMP の秒の小数部の有効桁数が設定されます。

sp_columns ストアド プロシージャによって IS_NULLABLE 列に "NO " ではなく "NO" が返される

SQL Server Native Client 10.0 (SQL Server 2008) 以降では、sp_columns ストアド プロシージャによって IS_NULLABLE 列に "NO " ではなく "NO" が返されます。

SQLSetDescRecSQLBindParameter、および SQLBindCol の一貫性チェックが実行される

SQL Server Native Client 10.0 より前のバージョンでは、SQL_DESC_DATA_PTR を設定すると、SQLSetDescRecSQLBindParameter、または SQLBindCol の記述子の型に対して一貫性チェックが行われませんでした。

SQLCopyDesc による記述子の一貫性チェックが行われる

SQL Server Native Client 10.0 より前のバージョンでは、SQL_DESC_DATA_PTR フィールドが特定のレコードで設定されている場合、SQLCopyDesc による一貫性チェックは行われませんでした。

SQLGetDescRec による記述子の一貫性チェックが行われなくなる

SQL Server Native Client 10.0 より前のバージョンでは、SQL_DESC_DATA_PTR フィールドが設定されている場合に、SQLGetDescRec による記述子の一貫性チェックが行われていました。 この一貫性チェックは、ODBC 仕様では不要になったため、SQL Server Native Client 10.0 (SQL Server 2008) 以降のバージョンでは行われなくなりました。

日付が範囲外の場合に別のエラーが返される

datetime 型で、範囲外の日付に対して SQL Server Native Client (SQL Server 2008 以降) によって返されるエラー番号が、前のバージョンで返されていたエラー番号と異なります。

具体的には、SQL Server Native Client 9.0 では、文字列から datetime への変換で年の値が範囲外の場合は 22007 が返されました。SQL Server Native Client 10.0 (SQL Server 2008) 以降のバージョンでは、日付が datetime2 でサポートされる範囲内でも、datetime または smalldatetime でサポートされる範囲外の場合、22008 が返されます。

丸め処理によって日が変わる場合に datetime 値では秒の小数部が丸められずに切り捨てられる

SQL Server Native Client 10.0 より前のバージョンでは、サーバーに送信される datetime 値は、クライアントによって 1/300 秒単位に丸められていました。 SQL Server Native Client 10.0 以降では、丸め処理によって日が変わる場合、秒の小数部が切り捨てられます。

datetime 値の秒が切り捨てられる場合がある

SQL Server 2008 Native Client 以降でビルドしたアプリケーションが 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 の変換コードによって日が変更されました。 SQL Server Native Client 10.0 以降では、日は変更されません (秒の小数部は丸められずに切り捨てられます)。

IBCPSession::BCColFmt による変換が変更される

SQL Server Native Client 10.0 以降では、IBCPSession::BCOColFmt を使用して SQLDATETIME または SQLDATETIME を文字列型に変換すると、小数値がエクスポートされます。 たとえば、SQLDATETIME 型を SQLNVARCHARMAX 型に変換すると、以前のバージョンの SQL Server Native Client では、

1989-02-01 00:00:00. SQL Server Native Client 10.0 以降のバージョンでは、1989-02-01 00:00:00.0000000 が返されます。

送信するデータのサイズを SQL_LEN_DATA_AT_EXEC で指定した長さと一致させる必要がある

SQL_LEN_DATA_AT_EXEC を使用する場合、データのサイズを SQL_LEN_DATA_AT_EXEC で指定した長さと一致させる必要があります。 SQL_DATA_AT_EXEC を使用することはできますが、SQL_LEN_DATA_AT_EXEC を使用するとパフォーマンスが向上する可能性があります。

BCP API を使用するカスタム アプリケーションで警告が表示される

指定されたフィールド長をデータ長が上回る場合、どの型の場合でも BCP API によって警告メッセージが生成されます。 以前のバージョンでは、この警告は、すべての型ではなく文字型についてのみ表示されました。

日付型または時刻型としてバインドされた sql_variant に空の文字列を挿入するとエラーが生成される

SQL Server Native Client 9.0 では、日付型または時刻型としてバインドされた sql_variant に空の文字列を挿入してもエラーは生成されませんでした。 SQL Server Native Client 10.0 以降では、この場合に正しくエラーが生成されます。

SQL_C_TYPE_TIMESTAMP と DBTYPE_DBTIMESTAMP のパラメーターの検証がより厳密に行われる

SQL Server 2008 Native Client より前のバージョンでは、SQL Server によって datetime 列と smalldatetime 列の桁数に合わせて datetime 値が丸められていました。 SQL Server 2008 Native Client 以降では、秒の小数部に対して、ODBC のコア仕様で定義されている、より厳密な検証規則が適用されます。 クライアントのバインドで明示的または暗黙的に指定された桁数を使用することによって、末尾の桁を切り捨てることなくパラメーター値を SQL 型に変換できない場合は、エラーが返されます。

SQL Server は、トリガーの実行時に異なる結果を返す場合がある

SQL Server 2008 で導入された変更により、NOCOUNT OFF が有効なときに、トリガーを実行させたステートメントからアプリケーションに返される結果が異なる可能性があります。 このような場合、アプリケーションでエラーが発生することがあります。 このエラーを解決するには、トリガーで NOCOUNT ON を設定するか、SQLMoreResults を呼び出して次の結果に進んでください。

関連項目

その他の技術情報

SQL Server Native Client プログラミング