MFCアプリ（マルチバイト文字セットで作成）からNvarcharのカラムのデータを取得時について


マルチバイト文字セットで作成したMFCアプリで  
<http://7ujm.net/C++/MFC%20ODBC.html>  
上記のようなプログラムで、ODBC接続してNVARCHARA(unicode）の文字列を取得しようとしています。  
特に問題なく、アプリ上で取得して表示できているのですが、  
MFCもしくはODBC側でShift-jisに変換しているのでしょうか？  
また変換されている場合、変換のON/OFFの切り替えはどこで行うのでしょうか？




フィールドデータ取得のために指定した変数の型に応じて変換されているのではないでしょうか？

参照先で「NVARCHARA(unicode）の文字列を取得」しているのはこの部分だと思われますが、  
DBアクセス変数定義：

>
[code]

>     //実行
>     CRecordset rs( &db );
>  
[/code]

途中省略して以下が値取得：

>
[code]

>     //値を表示
>     while( !rs.IsEOF() )
>     {
>         for(short index = 0; index < rs.GetODBCFieldCount(); index++ )   {
>             CString strValue;
>             rs.GetFieldValue( index, _T( strValue ) );
>             TRACE("%s\n",strValue);
>         }
>         rs.MoveNext();
>     }
>  
[/code]

`GetFieldValue`仕様のドキュメントでは以下のようになっていて、UNICODE(CStringW), Shift-
jisというかANSI(CStringA)の両方サポートされています。

[CRecordset:: GetFieldValue](https://docs.microsoft.com/ja-
jp/cpp/mfc/reference/crecordset-class?view=msvc-160#crecordsetgetfieldvalue)

>
[code]

>     void GetFieldValue(
>         short nIndex,
>         CStringA& strValue);
>  
>     void GetFieldValue(
>         short nIndex,
>         CStringW& strValue);
>  
>     nIndex
>     フィールドの0から始まるインデックス。
>  
>     strValue
>     フィールドのデータ型に関係なく、テキストに変換されたフィールドの値を格納するCStringオブジェクトへの参照。
>  
[/code]

MFCの`CString`型は、末尾の`A`,`W`が指定されていなければコンパイル時の`UNICODE`,`MBCS`マクロ指定の有無に応じて置換されるはずです。

[CString の使用](https://docs.microsoft.com/ja-jp/cpp/atl-mfc-shared/using-
cstring?view=msvc-160)

> オブジェクトは、 CString char wchar_t MBCS シンボルまたは UNICODE
> シンボルがコンパイル時に定義されているかどうかに応じて、型または型のいずれかをサポートします。

[CStringAクラス、CStringWクラス、CString クラス](http://hp30.blog.fc2.com/blog-
entry-8.html)

>
> CStringクラスはプロジェクトの文字セットがマルチバイト文字セットのときはCStringA、Unicode文字セットのときはCStringWにおきかえられるようになっている。
[code]

>     #ifdef _UNICODE
>     typedef CStringW CString;
>     #else
>     typedef CStringA CString;
>     #endif
>  
[/code]

* * *

なので、取得したデータを格納するためのパラメータ変数を、明示的に`CStringA`, `CStringW`で宣言し、`GetFieldValue(
index, _T( strValue ) );`呼び出し時の`_T( )`マクロを外して(?)、`GetFieldValue( index,
strValue );`のようにすれば、取得するデータのShift-jis/Unicode切り替えが明示的に出来るのではないでしょうか？

**試してみてください。**




フィールドデータ取得のために指定した変数の型に応じて変換されているのではないでしょうか？

参照先で「NVARCHARA(unicode）の文字列を取得」しているのはこの部分だと思われますが、  
DBアクセス変数定義：

>
[code]

>     //実行
>     CRecordset rs( &db );
>  
[/code]

途中省略して以下が値取得：

>
[code]

>     //値を表示
>     while( !rs.IsEOF() )
>     {
>         for(short index = 0; index < rs.GetODBCFieldCount(); index++ )   {
>             CString strValue;
>             rs.GetFieldValue( index, _T( strValue ) );
>             TRACE("%s\n",strValue);
>         }
>         rs.MoveNext();
>     }
>  
[/code]

`GetFieldValue`仕様のドキュメントでは以下のようになっていて、UNICODE(CStringW), Shift-
jisというかANSI(CStringA)の両方サポートされています。

[CRecordset:: GetFieldValue](https://docs.microsoft.com/ja-
jp/cpp/mfc/reference/crecordset-class?view=msvc-160#crecordsetgetfieldvalue)

>
[code]

>     void GetFieldValue(
>         short nIndex,
>         CStringA& strValue);
>  
>     void GetFieldValue(
>         short nIndex,
>         CStringW& strValue);
>  
>     nIndex
>     フィールドの0から始まるインデックス。
>  
>     strValue
>     フィールドのデータ型に関係なく、テキストに変換されたフィールドの値を格納するCStringオブジェクトへの参照。
>  
[/code]

MFCの`CString`型は、末尾の`A`,`W`が指定されていなければコンパイル時の`UNICODE`,`MBCS`マクロ指定の有無に応じて置換されるはずです。

[CString の使用](https://docs.microsoft.com/ja-jp/cpp/atl-mfc-shared/using-
cstring?view=msvc-160)

> オブジェクトは、 CString char wchar_t MBCS シンボルまたは UNICODE
> シンボルがコンパイル時に定義されているかどうかに応じて、型または型のいずれかをサポートします。

[CStringAクラス、CStringWクラス、CString クラス](http://hp30.blog.fc2.com/blog-
entry-8.html)

>
> CStringクラスはプロジェクトの文字セットがマルチバイト文字セットのときはCStringA、Unicode文字セットのときはCStringWにおきかえられるようになっている。
[code]

>     #ifdef _UNICODE
>     typedef CStringW CString;
>     #else
>     typedef CStringA CString;
>     #endif
>  
[/code]

* * *

なので、取得したデータを格納するためのパラメータ変数を、明示的に`CStringA`, `CStringW`で宣言し、`GetFieldValue(
index, _T( strValue ) );`呼び出し時の`_T( )`マクロを外して(?)、`GetFieldValue( index,
strValue );`のようにすれば、取得するデータのShift-jis/Unicode切り替えが明示的に出来るのではないでしょうか？

**試してみてください。**

