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

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

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。 今後、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server または最新の Microsoft ODBC Driver for SQL Server に切り替えてください。 SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、このサポート ライフサイクルの例外を参照してください。

このトピックでは、SQL Server 2005 (9.x) で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 (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 以降の SQL Server Native Client での動作の変更 (9.x) 説明
OLE DB によって定義された有効桁数までしか埋め込まれない 変換されたデータがサーバーに送信される変換の場合は、SQL Server Native Client (2008 SQL Server (10.0.x) 以降) では、datetime 値の最大長までのデータの末尾にゼロが埋め込まれます。 SQL Server Native Client 9.0 では、9 桁まで埋め込まれていました。
ICommandWithParameter::SetParameterInfo の DBTYPE_DBTIMESTAMP が検証される。 SQL Server Native Client (SQL Server 2008 (10.0.x 以降) では、ICommandWithParameter::SetParameterInfo の bScale に対する OLE DB 要件が実装され、DBTYPE_DBTIMESTAMPの秒の小数部の精度に設定されます。
sp_columns ストアド プロシージャによって IS_NULLABLE 列に "NO " ではなく "NO" が返される。 SQL Server Native Client 10.0 (SQL Server 2008 (10.0.x) 以降)、sp_columnsストアド プロシージャは、IS_NULLABLE列の "NO" ではなく "NO" を返すようになりました。
SQLSetDescRec、SQLBindParameter、SQLBindCol で整合性チェックが実行されるようになりました。 SQL Server Native Client 10.0 より前のバージョンでは、SQL_DESC_DATA_PTRを設定しても、SQLSetDescRec、SQLBindParameter、または SQLBindCol の記述子の種類に対して一貫性チェックが発生しませんでした。
SQLCopyDesc で記述子の整合性チェックが行われます。 SQL Server Native Client 10.0 より前のバージョンでは、SQLCopyDesc は、特定のレコードに対してSQL_DESC_DATA_PTR フィールドが設定されたときに、一貫性チェックを行いませんでした。
SQLGetDescRec では、記述子の整合性チェックが行われなくなりました。 SQL Server Native Client 10.0 より前のバージョンでは、SQLGetDescRec は、SQL_DESC_DATA_PTR フィールドが設定されたときにチェック記述子整合性を実行していました。 これは ODBC 仕様では必須ではなく、SQL Server Native Client 10.0 (SQL Server 2008 (10.0.x)) 以降のバージョンでは、この整合性チェックは実行されなくなりました。
日付が範囲外の場合に別のエラーが返される datetime 型の場合、以前のバージョンで返された日付とは異なるエラー番号がSQL Server Native Client (2008 SQL Server (10.0.x) 以降) によって返されます。

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

次に例を示します。

入力データ: 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 (10.0.x) Native Client より前のバージョンでは、datetime 列と smalldatetime 列のスケールに合わせて datetime 値が丸められ、SQL Server。 SQL Server 2008 (10.0.x) Native Client (以降) では、ODBC コア仕様で定義されているより厳密な検証規則を秒の小数部に適用します。 クライアントのバインドで明示的または暗黙的に指定された桁数を使用することによって、末尾の桁を切り捨てることなくパラメーター値を SQL 型に変換できない場合は、エラーが返されます。
SQL Server は、トリガーの実行時に異なる結果を返す場合がある SQL Server 2008 (10.0.x) で導入された変更により、NOCOUNT OFF が有効なときに、トリガーを実行させたステートメントからアプリケーションに返される結果が異なる可能性があります。 このような場合、アプリケーションでエラーが発生することがあります。 このエラーを解決するには、トリガーで NOCOUNT ON を 設定するか、SQLMoreResults を呼び出して次の結果に進めます。

参照

SQL Server Native Client プログラミング