c++ - 无法从 SQL Server 检索数据

标签 c++ sql-server odbc

全部,

要事第一。我的环境:

  • 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/

相关文章:

SQL - 动态 SQL 查询将用分号 (;) 分隔的单列字符串转换为多列

c++ - 未声明的标识符 SQL_SS_TABLE

c++ - 每 (n) 秒打印一次的程序

c++ - 如何查找 float 是否等于 C++ 中的整数值

sql - 在联接表中计数的最佳方法

c++ - MySQL 和 C 编程

使用 odbc/DBI 从 R 中的存储过程结果检索输出

c++ - 二进制文件读取一次读取的字节数不同的结果

c++ - 如何为派生类通用地实现复制构造函数?

sql - XML 到 SQL - SQL Server