Получить вектор из таблицы SQL 2008 - PullRequest
0 голосов
/ 15 июля 2011

У меня есть таблица с именем test с 6 столбцами и 6 строками в 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  

Я хотел бы иметь вектор со всеми значениями, но с порядком столбцов.

чтобы мой вектор выглядел так:

[ 
    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 для подключения с использованием 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;
}

с этим кодом внутриЦикл while я могу получить значения, но как я могу вставить их правильно в вектор?

Итак, как я могу включить векторный класс:

vector <double> v;
И иметь желаемый вектор ??

Я знаю, что для вставки в вектор я делаю это

v.push_back(467); ....

но как это сделать программно, ведь NULLS - настоящая проблема ...

1 Ответ

1 голос
/ 15 июля 2011

Из вопроса: на самом деле NULLS - реальная проблема ...
Действительно относительно простая проблема.Отслеживая строку и столбец, и поскольку вектор заполняется в порядке строк, значения ячейки ниже диагонали могут быть получены из их транспонированного местоположения, то есть по значению данных, легко находящихся в векторе.
Может быть что-то вроде следующего:

#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) проверяет, было ли предоставленное базой данных значение null.
лучшим тестом может быть
if (colNum >= rowNum) то есть предполагая, что нулевые значения находятся в нижнем треугольнике, и в соответствии с нашим получением значения в расположении "mirror" / "transpose" в верхнем треугольнике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...