gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:11 25 4
gpt4 key购买 nike

全部,

要事第一。我的环境:

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com