I have a table called test with 6 columns and 6 rows in SQL server 2008:
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
I would like to have a vector with all values, but with column order.
so my vector would look like
[
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
]
To do this I am using Vi开发者_如何学JAVAsual Studio 2008,with c++, nd for connecting using ADO.
// 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;
}
with that code, inside the while loop I can get the values, but How could I insert them the right way in the vector?
So How could I incorporate vector class:
vector <double> v;
I know that to insert to vector I do this
v.push_back(467);
....
but how to do it programatically, in fact the NULLS are the real problem...
From the question: in fact the NULLS are the real problem...
A relatively simple problem indeed. By keeping track of the row and column, and since the vector is filled-in in row order, the values of the cell below the diagonal can be obtained from their transpose location, i.e. in value of data readily in the vector.
Maybe something like the following:
#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();
}
A small note on the test for a null value
if (sVal)
tests if the database-supplied value was null.
a better test may be
if (colNum >= rowNum)
i.e. assuming that the null values are found in the lower triangle, and in agreement with our getting the value in the "mirror"/"transpose" location in the upper triangle.
精彩评论