无法从SQL Server检索数据

时间:2018-07-20 15:04:40

标签: c++ sql-server odbc

全部

第一件事。我的环境:

  • Windows 8.1
  • MSVC 2010 Pro
  • 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!

1 个答案:

答案 0 :(得分:0)

根据跟踪,您将列类型的SQL_C_CHAR传递给列3的SQLGetData。这就是为什么这是该列的格式。