从ADODB记录集中提取双精度值 [英] Extracting a double value from an ADODB recordset
问题描述
我无法从ADODB记录集中提取双精度浮点数的值.我想将值分配给C ++例程中的局部变量.我已经尝试过如下.
I''m having trouble extracting the value of a double-precision floating point number from an ADODB recordset. I want to assign the value to a local variable in my C++ routine. I''ve tried as follows.
double dblTemp = rst->Fields->GetItem("DoubleValue")->Value;
而且我也尝试过:
and I''ve also tried:
double dblTemp = rst->Fields->Item("DoubleValue")->Value;
但是两者都不起作用.有谁知道该怎么做并可以共享一个代码示例?我尝试查看Amit Dey的文章"ATL COM and ADO",但我需要一个带有双精度类型变量的示例.
请让我知道.
谢谢,
Carl Olen
But neither works. Does anyone know how to do this and can share a code example? I''ve tried looking at the article by Amit Dey entitled "ATL COM and ADO," but I need an example with a double type variable.
Please let me know.
Thanks,
Carl Olen
推荐答案
改为尝试Item
.
TryItem
instead.
rst->Fields->Item["DoubleValue"]->Value
我发布了此代码,但是我无法对其进行测试,因为我无法在笔记本电脑上建立ADODB连接.很久以前,我写了这个.此代码使记录集成为快照.
I post this code but i cannot test it, because i cant establish an ADODB connection on my laptop. Its a long time ago i wrote this. This code makes a snapshot of a recordset.
RecordSetSnapshot::RecordSetSnapshot(ADODB::_RecordsetPtr* rset)
{
long count;
unsigned int ix,iy;
long colrow[2];
_rows = 0;
_cols = (*rset)->Fields->Count;
try
{
_variant_t fields = vtMissing;
_variant_t data = (*rset)->GetRows(ADODB::adGetRowsRest,(long)ADODB::adBookmarkCurrent,fields);
_variant_t value;
if( (VT_EMPTY!=data.vt) && (S_OK==::SafeArrayGetUBound(data.parray,2,&count)) )
{
_rows = 1 + count;
for(ix=0;ix<_cols;ix++)
{
ADODB::Field* field = 0;
(*rset)->Fields->get_Item(_variant_t((long)ix),&field);
// store the field name here: field->Name;
field->Release();
}
for(ix=0;ix<_cols;ix++)
{
colrow[0] = ix;
for(iy=0;iy<_rows;iy++)
{
colrow[1] = iy;
if(S_OK==::SafeArrayGetElement(data.parray,colrow,&value))
{
// BSTR or something else. VT_R4 (is double)
VariantChangeType(&value,&value,0,VT_BSTR);
// store the value
VariantClear(&value);
}
}
}
}
VariantClear(&data);
VariantClear(&fields);
}
catch(_com_error e)
{
TRACE(_S("Error: %s\r\n"),(TCHAR*)e.Description());
Clear();
}
catch(...)
{
Clear();
}
}
希望这会有所帮助.
问候.
Hope this helps.
Regards.
这是一个可行的解决方案,我将继续以收到的其他想法进行开发.谢谢!
double dblTemp;
FieldsPtr字段;
FieldPtr字段;
变量D_Value;
VariantInit(& D_Value);
D_Value.vt = VT_R8;
变量索引;
VariantInit(& Index);
Index.vt = VT_I4;
Index.lVal = 1; //要检索的double值的字段索引.
HRESULT hr = rst-> get_Fields(& fields);
if(SUCCEEDED(hr)){
hr = fields-> get_Item(Index,& field);
}
if(SUCCEEDED(hr)){
hr = field-> get_Value(& D_Value);
}
dblTemp = D_Value.dblVal;
Here''s one solution that worked and I''m continuing to develop with other ideas I''ve received. Thanks!
double dblTemp;
FieldsPtr fields;
FieldPtr field;
VARIANT D_Value;
VariantInit(&D_Value);
D_Value.vt = VT_R8;
VARIANT Index;
VariantInit(&Index);
Index.vt = VT_I4;
Index.lVal = 1; // index of the field with the double value to be retreived.
HRESULT hr=rst->get_Fields(&fields);
if(SUCCEEDED(hr)) {
hr=fields->get_Item(Index, &field);
}
if(SUCCEEDED(hr)) {
hr=field->get_Value(&D_Value);
}
dblTemp = D_Value.dblVal;
这篇关于从ADODB记录集中提取双精度值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!