我在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),即假设在下三角形中找到空值,并且与我们在上三角形中的“镜像” /“转置”位置获得该值一致。

09-10 04:06
查看更多