全部
第一件事。我的环境:
现在是问题所在。
我正在尝试执行以下查询:
"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!
答案 0 :(得分:0)
根据跟踪,您将列类型的SQL_C_CHAR传递给列3的SQLGetData。这就是为什么这是该列的格式。