我在SQL Server 2008中有一个名为test的表,具有6列和6行:
1att 2att 3att 4att 5att 6att
----------------------------------
467 116 480 477 491 697
NULL 219 481 113 488 466
NULL NULL 477 466 455 480
NULL NULL NULL 527 483 629
NULL NULL NULL NULL 483 483
NULL NULL NULL NULL NULL 697
我想有一个具有所有值但具有列顺序的向量。
所以我的载体看起来像
[
467 116 480 477 491 697 //row 1
116 219 481 113 488 466 //row 2
480 481 477 466 455 480 //row 3
477 113 466 527 483 629 //row 4
491 488 455 483 483 483 //row 5
697 466 480 629 483 697 //row 6
]
为此,我将Visual Studio 2008与c ++一起使用nd进行连接。
// svd-conn.cpp: archivo de proyecto principal.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#define MSADO15_PATH "c:\program files\common files\system\ado\msado15.dll"
#ifdef _MSC_VER
#import MSADO15_PATH rename ("EOF","adoEOF") no_namespace
#else
#define V_INT(X) V_UNION(X, intVal)
#define V_UINT(X) V_UNION(X, uintVal)
#include "msado15.tlh"
#endif
#include <comutil.h>
struct InitOle{
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} InitOle_tag;
//------------------ utility fns to simplify access to recordset fields
_bstr_t RsItem( _RecordsetPtr p, BSTR fldName ){
// by field name
return( p->Fields->Item[_variant_t(fldName)]->Value );
}
_bstr_t RsItem( _RecordsetPtr p, long nIdx ){
// by field # (0 is first)
return( p->Fields->Item[_variant_t(nIdx)]->Value );
}
//-------------------------------- The Program ----------------
int main(){
_RecordsetPtr spRs;
HRESULT hr;
_bstr_t sConn= "driver={sql server};SERVER=VIRTUALPC;Database=test;UID=sa; PWD=;";
_bstr_t sSQL= "SELECT * FROM dbo.test ;";
try{
hr= spRs.CreateInstance( __uuidof(Recordset) );
if FAILED(hr)
printf("CreateInstance failed\n");
else
printf("CreateInstance SUCCESS\n");
hr= spRs->Open( sSQL, sConn, adOpenForwardOnly, adLockReadOnly, adCmdText );
if FAILED(hr)
printf("Open failed\n");
else
printf("Open SUCCESS\n");
printf("spRs->adoEOF %s\n",spRs->adoEOF);
while( !(spRs->adoEOF) ) {
printf("%s\t%s\n",(char*) RsItem( spRs, 0L ),(char*) RsItem( spRs, 1L ),(char*) RsItem( spRs, 2L ) );
spRs->MoveNext();
}
spRs->Close();
} catch( _com_error &e) {
printf("Error:%s\n",(char*)e.Description());
}
return 0;
}
使用该代码,可以在while循环内获取值,但是如何在向量中正确插入它们呢?
那么我如何合并向量类:
vector <double> v;
并有希望的载体吗?
我知道要插入向量中
v.push_back(467);
....但是如何以编程方式做到这一点,实际上NULL是真正的问题...
最佳答案
从问题上来看:实际上,NULL是真正的问题...
确实是一个相对简单的问题。通过跟踪行和列,并且由于矢量是按行顺序填充的,对角线以下的单元格的值可以从它们的转置位置获得,即容易获得矢量中的数据值。
也许像下面这样:
#define COLS_PER_ROW 6
int rowNum = 0;
vector <double> v(COLS_PER_ROW * COLS_PER_ROW, 0);
while( !(spRs->adoEOF) ) {
for (colNum = 0; colNum < COLS_PER_ROW; colNum++)
{
double dVal;
bstr_t sVal = RsItem(spRs, colNum);
if (sVal) // this test is equivalent to if (colNum >= rowNum)
{
dval = strtod(sVal, NULL);
}
else
dVal = v[colNum * COLS_PER_ROW + rowNum]; // not an error as we want to read the transpose loc for the cell.
}
rowNum++;
spRs->MoveNext();
}
关于空值测试的小注意事项
if (sVal)
测试数据库提供的值是否为空。更好的测试可能是
if (colNum >= rowNum)
,即假设在下三角形中找到空值,并且与我们在上三角形中的“镜像” /“转置”位置获得该值一致。