全部,
要事第一。我的环境:
- Windows 8.1
- MSVC 2010 专业版
- SQL Server 2005(Windows 自带)
- Windows 自带的 ODBC 驱动程序
现在解决问题。
我正在尝试执行以下查询:
"SET NOCOUNT ON; DECLARE @TargetDialogHandle UNIQUEIDENTIFIER;
"DECLARE @EventMessage XML; ";
"DECLARE @EventMessageTypeName sysname; ";
"WAITFOR( RECEIVE TOP(1) @TargetDialogHandle = conversation_handle, @EventMessage = CONVERT(XML, message_body), @EventMessageTypeName = message_type_name FROM dbo.EventNotificationQueue ), TIMEOUT 1000;";
"SELECT @EventMessageTypeName AS MessageTypeName, @EventMessage.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') AS TSQLCommand, @EventMessage.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(128)' ) as TableName";
代码如下(为了简化省略了错误处理;代码是在 UNICODE 模式下编译的):
SQLWCHAR *columnData[3];
for( ret = SQLFetch( m_hstmt ); ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ) && ret != SQL_NO_DATA; ret = SQLFetch( m_hstmt ) )
{
ret = SQLGetData( m_hstmt, 1, *columnDataType[0], columnData[0], *columnDataSize[0], &messageType );
ret = SQLGetData( m_hstmt, 2, *columnDataType[1], columnData[1], *columnDataSize[1], &sqlCommand );
ret = SQLGetData( m_hstmt, 3, *columnDataType[2], columnData[2], *columnDataSize[2], &name );
}
在 Server Management Studio 中执行查询,我看到所有 3 列都使用明文正确检索。
当我尝试运行上面的代码时,只有第 1 列和第 2 列有文本。第 3 列数据有一些垃圾(columnData[2] 包含一些汉字)。
然而,当我在 Windows 中打开 ODBC DM 的日志记录时,一切都被正确检索:
docview 1ac4-142c EXIT SQLFetch with return code 0 (SQL_SUCCESS)
HSTMT 0x34A4AC98
docview 1ac4-142c ENTER SQLGetData
HSTMT 0x34A4AC98
UWORD 1
SWORD -8 <SQL_C_WCHAR>
PTR 0x0D782EF8
SQLLEN 128
SQLLEN * 0x3FE8F610
docview 1ac4-142c EXIT SQLGetData with return code 1 (SQL_SUCCESS_WITH_INFO)
HSTMT 0x34A4AC98
UWORD 1
SWORD -8 <SQL_C_WCHAR>
PTR 0x0D782EF8 [ 128] "http://schemas.microsoft.com/SQL/Notifications/EventNotificatio\ 0"
SQLLEN 128
SQLLEN * 0x3FE8F610 (128)
DIAG [01004] [Microsoft][SQL Server Native Client 11.0]String data, right truncation (0)
docview 1ac4-142c ENTER SQLGetData
HSTMT 0x34A4AC98
UWORD 2
SWORD -8 <SQL_C_WCHAR>
PTR 0x0D886FF8
SQLLEN 2048
SQLLEN * 0x3FE8F604
docview 1ac4-142c EXIT SQLGetData with return code 0 (SQL_SUCCESS)
HSTMT 0x34A4AC98
UWORD 2
SWORD -8 <SQL_C_WCHAR>
PTR 0x0D886FF8 [ 32] "DROP TABLE test;"
SQLLEN 2048
SQLLEN * 0x3FE8F604 (32)
docview 1ac4-142c ENTER SQLGetData
HSTMT 0x34A4AC98
UWORD 3
SWORD 1 <SQL_C_CHAR>
PTR 0x0C0AEEF8
SQLLEN 128
SQLLEN * 0x3FE8F5F8
docview 1ac4-142c EXIT SQLGetData with return code 0 (SQL_SUCCESS)
HSTMT 0x34A4AC98
UWORD 3
SWORD 1 <SQL_C_CHAR>
PTR 0x0C0AEEF8 [ 4] "test"
SQLLEN 128
SQLLEN * 0x3FE8F5F8 (4)
MSVC 项目声明了“UNICODE”符号,但相关列被检索为 SQL_C_CHAR 而不是 SQL_C_WCHAR。
这是怎么回事?有人可以阐明一下吗?我是否应该将 SQL_C_WCHAR 传递给 SQLGetData() 以接收正确的值?
TIA!
最佳答案
根据跟踪,您将列类型的 SQL_C_CHAR 传递给第 3 列的 SQLGetData。这就是该列的格式的原因。
关于c++ - 无法从 SQL Server 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51445462/