次の方法で共有


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

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) は同梱されていません。

  • SQL Server 2022 (16.x) 以降
  • SQL Server Management Studio (19 以降) の場合:

SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。

新しいプロジェクトの場合は、次のいずれかのドライバーを使用します。

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 (SQL Server 2008 (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 (SQL Server 2008 (10.0.x) 以降) によって、以前のバージョンで返された日付とは異なるエラー番号が返されます。

具体的には、SQL Server Native Client 9.0 は、文字列変換で範囲外のすべての年の値に対して 22007 datetime を返しました バージョン 10.0 以降の SQL Server Native Client (SQL Server 2008 (10.0.x)) は、日付が datetime2 でサポートされている範囲内にありdatetime または smalldatetime でサポートされる範囲外の場合に 22008 を返します。
丸め処理によって日が変わる場合に 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) の型識別子と小数点以下桁数 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 (10.0.x) Native Client より前のバージョンでは、 datetime の値は、SQL Server の datetime 列と smalldatetime 列のスケールに合わせて丸められました。 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 プログラミング