数据库执行以下语句
m_Command->CommandText="select convert( UNIQUEIDENTIFIER ,'{33333333-3333-3333-3333-333333333333}') as Guid";
在客户端返回得到的值,希望取得GUID的二进制内容,但是总返回BSTR字符串
VARIANT vtValue = m_Recordset->Fields->GetItem((long)0)->Value;
查了很久,都没有人用到SQL返回GUID类型而需要他二进制值的,他们都只需要显示GUID所以没有解决这个问题。
完整代码如下:// VTEMUN.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")_ConnectionPtr m_Connection; // 数据库连接对象
_RecordsetPtr m_Recordset; // 记录集对象
_CommandPtr m_Command; // 命令对象
const int MAX_CONNECTSTRING_LEN = 255;
char m_szConnectString[MAX_CONNECTSTRING_LEN]; // 数据库连接字符串// 设置数据库连接字符串
BOOL setConnectString(char *szDataSource, char *szDBName, char *szUser, char *szPsw)
{
if (NULL == szDataSource || NULL == szDBName || NULL == szUser || NULL == szPsw)
{
return FALSE;
} if (strlen(szDataSource) + strlen(szDBName) + strlen(szUser) + strlen(szPsw) >= MAX_CONNECTSTRING_LEN - 128)
{
return FALSE;
} memset(m_szConnectString, 0, sizeof(m_szConnectString)); strcpy(m_szConnectString, "Provider=SQLOLEDB;Data Source=");
strcat(m_szConnectString, szDataSource);
strcat(m_szConnectString,";Initial Catalog=");
strcat(m_szConnectString, szDBName);
strcat(m_szConnectString,";User ID=");
strcat(m_szConnectString, szUser);
strcat(m_szConnectString,";Password=");
strcat(m_szConnectString, szPsw); return TRUE;
}int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); if (FAILED(m_Connection.CreateInstance(__uuidof(Connection))))
{
return FALSE;
} if (FAILED(m_Recordset.CreateInstance(__uuidof(Recordset))))
{
return FALSE;
} if (FAILED(m_Command.CreateInstance(__uuidof(Command))))
{
return FALSE;
} setConnectString(".", "master", "sa", "1234"); if (FAILED(m_Connection->Open(m_szConnectString, L"", L"", adConnectUnspecified)))
{
return FALSE;
} m_Recordset->PutRefSource(m_Command);
m_Recordset->CursorLocation = adUseClient; m_Command->ActiveConnection = m_Connection;
m_Command->CommandType = adCmdText;
m_Command->CommandText="select convert( UNIQUEIDENTIFIER ,'{33333333-3333-3333-3333-333333333333}') as Guid"; HRESULT hr = m_Recordset->Open((IDispatch*)m_Command, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified);
_variant_t vtType = m_Recordset->Fields->Item["Guid"]->Type;
// vtType =72,VT_CLSID类型
VARIANT* vtValue = &(m_Recordset->Fields->GetItem((long)0)->Value);
// 现在得到了GUID值得字符串内容,我希望的是原始的_GUID 值(byte[16]) m_Connection->Close(); if (m_Connection != NULL)
{
m_Connection.Release();
m_Connection = NULL;
} if (m_Recordset != NULL)
{
m_Recordset.Release();
m_Recordset = NULL;
} if (m_Command != NULL)
{
m_Command.Release();
m_Command = NULL;
} CoUninitialize();
return 0;
}
m_Command->CommandText="select convert( UNIQUEIDENTIFIER ,'{33333333-3333-3333-3333-333333333333}') as Guid";
在客户端返回得到的值,希望取得GUID的二进制内容,但是总返回BSTR字符串
VARIANT vtValue = m_Recordset->Fields->GetItem((long)0)->Value;
查了很久,都没有人用到SQL返回GUID类型而需要他二进制值的,他们都只需要显示GUID所以没有解决这个问题。
完整代码如下:// VTEMUN.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")_ConnectionPtr m_Connection; // 数据库连接对象
_RecordsetPtr m_Recordset; // 记录集对象
_CommandPtr m_Command; // 命令对象
const int MAX_CONNECTSTRING_LEN = 255;
char m_szConnectString[MAX_CONNECTSTRING_LEN]; // 数据库连接字符串// 设置数据库连接字符串
BOOL setConnectString(char *szDataSource, char *szDBName, char *szUser, char *szPsw)
{
if (NULL == szDataSource || NULL == szDBName || NULL == szUser || NULL == szPsw)
{
return FALSE;
} if (strlen(szDataSource) + strlen(szDBName) + strlen(szUser) + strlen(szPsw) >= MAX_CONNECTSTRING_LEN - 128)
{
return FALSE;
} memset(m_szConnectString, 0, sizeof(m_szConnectString)); strcpy(m_szConnectString, "Provider=SQLOLEDB;Data Source=");
strcat(m_szConnectString, szDataSource);
strcat(m_szConnectString,";Initial Catalog=");
strcat(m_szConnectString, szDBName);
strcat(m_szConnectString,";User ID=");
strcat(m_szConnectString, szUser);
strcat(m_szConnectString,";Password=");
strcat(m_szConnectString, szPsw); return TRUE;
}int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); if (FAILED(m_Connection.CreateInstance(__uuidof(Connection))))
{
return FALSE;
} if (FAILED(m_Recordset.CreateInstance(__uuidof(Recordset))))
{
return FALSE;
} if (FAILED(m_Command.CreateInstance(__uuidof(Command))))
{
return FALSE;
} setConnectString(".", "master", "sa", "1234"); if (FAILED(m_Connection->Open(m_szConnectString, L"", L"", adConnectUnspecified)))
{
return FALSE;
} m_Recordset->PutRefSource(m_Command);
m_Recordset->CursorLocation = adUseClient; m_Command->ActiveConnection = m_Connection;
m_Command->CommandType = adCmdText;
m_Command->CommandText="select convert( UNIQUEIDENTIFIER ,'{33333333-3333-3333-3333-333333333333}') as Guid"; HRESULT hr = m_Recordset->Open((IDispatch*)m_Command, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified);
_variant_t vtType = m_Recordset->Fields->Item["Guid"]->Type;
// vtType =72,VT_CLSID类型
VARIANT* vtValue = &(m_Recordset->Fields->GetItem((long)0)->Value);
// 现在得到了GUID值得字符串内容,我希望的是原始的_GUID 值(byte[16]) m_Connection->Close(); if (m_Connection != NULL)
{
m_Connection.Release();
m_Connection = NULL;
} if (m_Recordset != NULL)
{
m_Recordset.Release();
m_Recordset = NULL;
} if (m_Command != NULL)
{
m_Command.Release();
m_Command = NULL;
} CoUninitialize();
return 0;
}
// vtType =72,VT_CLSID类型 VARIANT* vtValue = &(m_Recordset-> Fields-> GetItem((long)0)-> Value);
这里就是BSTR了
你试过了吗?让我看一下你的代码。
那么请问大家,VT_CLSID是怎样存取的呢?
-- 以 GUID 12345678-1234-1234-1234-123456789012(0x78563412123412341234123456789012)select convert(uniqueidentifier, 0x78563412123412341234123456789012) as Guid-- 要使用字符串形式的也可以
select convert(uniqueidentifier, '12345678-1234-1234-1234-123456789012') as Guid
select convert(uniqueidentifier, '{12345678-1234-1234-1234-123456789012}') as Guid
-- 如果你无法直接处理 uniqueidentifier 类型的字段,那可以把 uniqueidentifier 字段转换成 binary(16) 来处理
select convert(binary(16), convert(uniqueidentifier, 0x78563412123412341234123456789012)) as Bytes
select convert(binary(16), convert(uniqueidentifier, '12345678-1234-1234-1234-123456789012')) as Bytes
select convert(binary(16), convert(uniqueidentifier, '{12345678-1234-1234-1234-123456789012}')) as Bytes
/*
Guid
------------------------------------
12345678-3412-3412-1234-123456789012(1 行受影响)Guid
------------------------------------
12345678-1234-1234-1234-123456789012(1 行受影响)Guid
------------------------------------
12345678-1234-1234-1234-123456789012(1 行受影响)Bytes
----------------------------------
0x78563412123412341234123456789012(1 行受影响)Bytes
----------------------------------
0x78563412341234121234123456789012(1 行受影响)Bytes
----------------------------------
0x78563412341234121234123456789012(1 行受影响)*/
由于系统操作量大,我们希望优化不必要的转换(GUID->STR->GUID),才提出该问题的.
现在我们的做法是在数据库返回的时候,转为BINARY类型select ID, NAME, convert(binary(16), GUID) as GUID FROM [USERS]
这样ADO取到的就是一个SAFEARRAY了,满足我们的业务需要