我在SQLGetPrivateProfileString
中使用从odbcinst.ini
(Registry)读取DSN参数。
但是如果我在DSN中使用像UID='König'
这样的字符并打电话
SQLGetPrivateProfileString(DSN, INI_USERNAME, "", temp, sizeof(temp), ODBC_INI)
变量temp='K?nig'
当然,odbc无法连接到数据源。如何读取正确的值?
需要调用函数的Unicode版本,即SQLGetPrivateProfileStringW
。见this Microsoft doc
如果使用_UNICODE #define编译应用程序,则ODBC头文件会将未修饰的函数调用映射到Unicode版本。
您可以通过以下两种方式之一将应用程序重新编译为Unicode应用程序:
- 在应用程序中包含Sqlucode.h头文件中包含的Unicode #define。
- 使用编译器的Unicode选项编译应用程序。 (对于不同的编译器,此选项会有所不同。)
见odbcinst.h:
#ifdef UNICODE
...
#define SQLGetPrivateProfileString SQLGetPrivateProfileStringW
...
其中SQLGetPrivateProfileStringW
被声明为:
int INSTAPI SQLGetPrivateProfileStringW
(
_In_opt_ LPCWSTR lpszSection,
_In_opt_ LPCWSTR lpszEntry,
_In_opt_ LPCWSTR lpszDefault,
_Out_writes_opt_(cchRetBuffer) LPWSTR lpszRetBuffer,
int cchRetBuffer,
_In_opt_ LPCWSTR lpszFilename
);
该函数的Unicode版本接收LPCWSTR
和LPWSTR
,它们是指向一串16位Unicode字符的指针。无论其他功能将接收这些值,还需要是Unicode版本。