Avatar billede kierch Nybegynder
20. december 2004 - 14:04 Der er 21 kommentarer

RecordSet , Søgning i Database

Hej jeg har et program der skriver i en Access database. Database filen er placeret på en maskine på et netværk. Jeg skriver i filen med nedenstående kode. Men hvordan kan jeg søge i filen. Skal jeg bruge SELECT. Hvis ja hvordan arbejder jeg så viedere med resultatet. ?

bool CTpYieldConnect::NewPos(const CString &operatorId,const CString &orderNumber,const CString &orderSize,const CString &partNumber, const CString &serialNumber,const CString status,const CString &voltage,const CString &current,const CString &StationId)
{
    bool bRet = false;
    if(m_bLoaded)
    {
        // Need to actually verify that the file exists (if it was the first one, it may not as it's incomplete)
        LogRecordSet logDataRecordSet(&m_dbYield);
        try
        {
            logDataRecordSet.Open(NULL);


            logDataRecordSet.AddNew();
            logDataRecordSet.m_OperatorId = atoi(operatorId);
            logDataRecordSet.m_OrderNumber = orderNumber;
            logDataRecordSet.m_OrderSize = atoi(orderSize);
            logDataRecordSet.m_PartNumber = partNumber;
            logDataRecordSet.m_SerialNumber = serialNumber;
            logDataRecordSet.m_Status = status; //PASS FAIL
            logDataRecordSet.m_Voltage = atoi(voltage);
            logDataRecordSet.m_Current = atof(current);
            logDataRecordSet.m_TestStationID = StationId;


            CTime timeCur = CTime::GetCurrentTime();
            logDataRecordSet.m_Date = timeCur;

            bRet = logDataRecordSet.Update();
       
    }
    catch( CDBException* e )
    {
        AfxMessageBox( e->m_strError, 
                      MB_ICONEXCLAMATION );
        // Delete the incomplete recordset object
        //delete m_pSet;
        //m_pSet = NULL;
        e->Delete();
        bRet = false;
    }


   
       
        logDataRecordSet.Close();
    }
    return(bRet);
   

}
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:10 #1
http://www.kbcafe.com/articles/HowTo.ADO.CPlusPlus.pdf <- Er et rigtig godt link til en simple tutorial omkring database adgang i c++, jeg bruger selv en modificeret udgave af hans kode og det tager omkring 30 minutter at læse om omstrukture koden.
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:10 #2
om = og :-)
Avatar billede kierch Nybegynder
20. december 2004 - 14:15 #3
Fint nok men det er et eks. på skrivning i en ADO database. Min skrive del virker fint. Det er når jeg skal til at bruge de data der ligger i databasen det går galt. Hvordan henter jeg noget tilbage i mit program. Jeg vil f.eks gerne søge på om et bestem serie nummer har passeret test før.
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:16 #4
Eksemplet henter oxo fra databasen.
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:19 #5
CODE SNIPPET:
CString sql;
sql.Format("Select * from defaultPorts");
recordset->Open(sql.GetString(), connection.GetInterfacePtr(),
/*ADODB::*/adOpenForwardOnly , /*ADODB::*/adLockReadOnly,
/*ADODB::*/adCmdText);

while (!recordset->EndOfFile)
{
    // temp variabler
    CString name;
    int db_port;
    int db_timeout;
   
    _variant_t var;
    var = recordset->Fields->GetItem(L"Name")->GetValue();
    name = var;
    var = recordset->Fields->GetItem(L"TimeInMS")->GetValue();
    db_timeout = var;
    var = recordset->Fields->GetItem(L"Port")->GetValue();
    db_port = var;
    recordset->MoveNext();
}
recordset->Close();
END CODE SNIPPET:
Denne stump kode hentes alt data fra en tabel som hedder defaultPorts(Dette defineres i CString SQL'en) og derefter køres alle igennem, hvor alle værdier udtrækkes.
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:20 #6
et eksempel fra min egen kode.
Avatar billede kierch Nybegynder
20. december 2004 - 14:25 #7
Vil der så ikke blive kommunikeret over netværket for hver record når min database fil er placeret på en anden PC. Vil det ikke tage lang tid at søge databasen igennem ?
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:27 #8
Dette eksempel henter hele recordset ned på den lokale maskine, og gennemsøger det her. - Jeg antager at databasen ligger på en anden maskine, som deler den fil via et share?
Avatar billede kierch Nybegynder
20. december 2004 - 14:45 #9
Forstår ikke helt dit eks. CString i Visual C++ indeholder da ikke en GetString ???
Avatar billede kierch Nybegynder
20. december 2004 - 14:46 #10
skal siges jeg er Newbee i database interface
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:47 #11
recordset->Open("Din SQL streng her", connection.GetInterfacePtr(),
adOpenForwardOnly , adLockReadOnly, adCmdText);
^
|

Dette vil fylde det pågældende recordset med data.
Avatar billede rbj_fp Nybegynder
20. december 2004 - 14:48 #12
Jeg laver lige en simpel eksempel du kan ændre i.
Avatar billede kierch Nybegynder
20. december 2004 - 14:50 #13
tager du det hele med i eks. dvs opretelse af record set m.m
Avatar billede rbj_fp Nybegynder
20. december 2004 - 15:09 #14
#pragma once
#include <tchar.h>
#include <iostream>
#include <string>
#pragma warning(push)
#pragma warning(disable:4146) // Microsoft BUG ! ! !
#import "..\mdac26\msado15.dll" no_namespace rename("EOF", "EndOfFile")
#pragma warning(pop)

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    CoInitialize(NULL);
   
    _ConnectionPtr connection;
    _RecordsetPtr recordset;
   
    try
    {
        hr = connection.CreateInstance(__uuidof(Connection));//ADODB::Connection));
        if (FAILED(hr))
        {
            throw _com_error(hr);

        }

        hr = recordset.CreateInstance(__uuidof(Recordset));//ADODB::Recordset));
        if (FAILED(hr))
        {
            throw _com_error(hr);

        }
        // åbner Databasen
        connection->CursorLocation = adUseClient; //ADODB::adUseClient;
        connection->Open(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\Temp.mdb;"
            , L"", L"", /*ADODB::*/adConnectUnspecified);

        recordset->Open("Select * from Test", connection.GetInterfacePtr(),
        /*ADODB::*/adOpenForwardOnly , /*ADODB::*/adLockReadOnly,
        /*ADODB::*/adCmdText);
       
        while (!recordset->EndOfFile)
        {
            variant_t var;
            var = recordset->Fields->GetItem(L"Tester")->GetValue();
            std::cout << static_cast<char*>(_bstr_t(var.bstrVal)) << std::endl;
            recordset->MoveNext();
        }
        recordset->Close();
        connection->Close();

       
        return 0;
    }
    catch(_com_error &e)
    {
        // her fanges com fejlene
        return -2;
    }
    catch(...)
    {
        // her fanges alt andet...
        return -1;
    }
   
}
Avatar billede rbj_fp Nybegynder
20. december 2004 - 15:14 #15
Her er selve koden.
Jeg har lavet en database på placering: c:\temp.mdb, som indeholder en tabel som hedder test. Tabellen indeholder et felt som er af typen tekst og felt navnet er "Tester".

Jeg har haft det placeret i mappen c:\udvikling\adoselect\ og du skal ligge mærke til at jeg laver en direkte reference til c:\udvikling\mdac katalog i min
#import "..\mdac26\msado15.dll" no_namespace rename("EOF", "EndOfFile") linie. Der skal du have en mdac liggende(denne kan hentes fra microsoft.com og så skal du ændre din  import sti, sådan at dette passer.

Koden er blevet kompileret og testet på en windows 2000 maskine under visual studio .NET 2003 professionel.

Så skulle der vidst ikke være mere
Avatar billede rbj_fp Nybegynder
20. december 2004 - 15:15 #16
jo det skulle der. Den MDAC version jeg bruger i eksemplet er 2.6 Refresh versionen, men dette burde ikke have noget at sige.
Avatar billede kierch Nybegynder
20. december 2004 - 15:17 #17
Ok Smider du er svar så får du point
Avatar billede rbj_fp Nybegynder
20. december 2004 - 15:18 #18
here.... men bare skriv hvis der er problemer :-D
Avatar billede rbj_fp Nybegynder
21. december 2004 - 08:55 #19
Hvordan går det med at udvælge data?
Avatar billede kierch Nybegynder
21. december 2004 - 08:58 #20
Er pt. blevet afbrudt med en anden opgave. Men skal nok vende tilbage med status senere idag
Avatar billede rbj_fp Nybegynder
21. december 2004 - 08:58 #21
kk... :-D (Kender det alt for godt)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester