[英]Get a vector from a sql 2008 table
I have a table called test with 6 columns and 6 rows in SQL server 2008:我在 SQL 服务器 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
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 Visual Studio 2008,with c++, nd for connecting using ADO.为此,我使用带有 c++ 的 Visual Studio 2008,以及使用 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?使用该代码,在 while 循环中我可以获得值,但是如何将它们以正确的方式插入向量中?
So How could I incorporate vector class:那么我如何合并向量 class:
vector <double> v;
And have the wished vector??并有希望的向量?
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...但是如何以编程方式做到这一点,实际上 NULLS 是真正的问题......
From the question: in fact the NULLS are the real problem ...从问题:实际上NULLS是真正的问题......
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, ie 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关于 null 值测试的小记if (sVal)
tests if the database-supplied value was null. if (sVal)
测试数据库提供的值是否为 null。
a better test may be更好的测试可能是if (colNum >= rowNum)
ie 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. if (colNum >= rowNum)
即假设在下三角形中找到 null 值,并且与我们在上三角形中的“镜像”/“转置”位置获得值一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.