Avatar billede neuro Nybegynder
05. november 2001 - 14:41 Der er 29 kommentarer og
3 løsninger

SQL Server / C++

Jeg er igang med at skrive en consol applikation, som skal kunne connect til en SQL Server via ODBC (DSN). Min applikation skal kunne execute en SQL forespørgelse samt returnerer i et recordset.

Er der nogen der ved hvordan man skal bærer sig ad med det? Kender en udførlig tutorial? Eller lignende???
Avatar billede jpk Nybegynder
05. november 2001 - 14:44 #1
Hvilket miljø?
Avatar billede neuro Nybegynder
05. november 2001 - 14:52 #2
Windows 2000 Server.
Avatar billede neuro Nybegynder
05. november 2001 - 14:58 #3
jeg er klar over at det nok er en stor opgave, men hvis der findes nogle udførlige tutorials vil det være til stor hjælp!

eller hvis nogen kender til noget godt kommenteret sourcecode som man kan se på?
Avatar billede jpk Nybegynder
05. november 2001 - 14:59 #4
Okay, jeg mente nu jhvilket miljø du udvikler i!
Er det VC++, Borland, ren C++, MFC....?
Avatar billede neuro Nybegynder
05. november 2001 - 15:02 #5
VC++
Avatar billede jpk Nybegynder
05. november 2001 - 15:04 #6
så er vi der næsten.... bruger du ren C++ eller MFC?
Avatar billede neuro Nybegynder
05. november 2001 - 15:05 #7
ren c++
Avatar billede neuro Nybegynder
05. november 2001 - 15:05 #8
bryder mig ikke om MFC
Avatar billede goz Nybegynder
05. november 2001 - 15:09 #9
Avatar billede jpk Nybegynder
05. november 2001 - 15:14 #10
Tja, hver sin smag...
I MFC kan man gøre det samme på ganske få linier!
Avatar billede neuro Nybegynder
05. november 2001 - 15:17 #11
hvordan fungerer det i MFC?
Avatar billede jpk Nybegynder
05. november 2001 - 15:24 #12
Man arbejder på database- og recordset-objekter.
Avatar billede neuro Nybegynder
05. november 2001 - 15:25 #13
det lyder umiddelbart som en god måde. jeg er vant til at kode i VB og er fornylig begyndt med c++, da jeg skulle have lidt mere udfordring. og fra VB er jeg vandt til db og rs objekter.

har du et eksempel på det?
Avatar billede jpk Nybegynder
05. november 2001 - 15:31 #14
Prøv at checke CDatabase og CRecordset i dokumentationen, det grundlæggende er faktisk ikke så forskelligt fra VB...
Avatar billede jpk Nybegynder
05. november 2001 - 15:34 #15
fx kan du:

CDatabase DB;
if(!DB.Open(\"Navn på DB i DSN\"))
  AfxMessageBox(\"Could not open database\", MB_ICONEXCLAMATION);

DB.ExecuteSQL(\"SQL text\");
Avatar billede neuro Nybegynder
05. november 2001 - 15:36 #16
Hvordan returnerer man så et recordset og looper igennem det og skriver ud via printf?
Avatar billede neuro Nybegynder
05. november 2001 - 15:43 #17
når jeg linker #include <afxdb.h> ind i mit projekt får jeg følgende fejl:

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Debug/sqlaxs.exe : fatal error LNK1120: 2 unresolved externals

?????????????????
Avatar billede jpk Nybegynder
05. november 2001 - 15:49 #18
Brug CRecordset... (bruger DB objekt fra tidligere indlæg)

CRecordset Recordset(DB);
Recordset.Open(AFX_DB_USE_DEFAULT_TYPE, \"SELECT ...\");

Du kan så bruge CRecordset\'s metoder (IsEOF, IsBOF, MoveFirst, MoveNext, MovePrev osv.)
Avatar billede jpk Nybegynder
05. november 2001 - 15:50 #19
Hvilken rækkefølge includer du i?
Prøv at sætte #include <afxdb.h> helt øverst...
Avatar billede neuro Nybegynder
05. november 2001 - 15:52 #20
ok lyder da som noget jeg liiiiiiiiiige vil stikke næsen i :) kigger på det ... :)
Avatar billede neuro Nybegynder
05. november 2001 - 15:52 #21
kigger lige på de 2 forskellige svar - og uddeler derefter point :)
Avatar billede moykal Nybegynder
05. november 2001 - 16:45 #22
Hvad med at anvende ADO... Det er da ikke en skid enklere i MFC end i en konsol.
Avatar billede jpk Nybegynder
05. november 2001 - 16:52 #23
=>moykal
Øh, er der nogle der har sagt det?
Avatar billede jpk Nybegynder
05. november 2001 - 16:54 #24
Desuden er der jo ingen sammeligning...
MFC og konsol er vidt forskellige ting!
Avatar billede neuro Nybegynder
05. november 2001 - 19:23 #25
jeg kan vel sagtens anvende MFC selv om det er en consol applikation ?!?!
Avatar billede neuro Nybegynder
05. november 2001 - 19:23 #26
moykal> hvordan fungerer ADO i c++ ??
Avatar billede moykal Nybegynder
05. november 2001 - 20:36 #27
Da ADO er COM-baseret virker det nøjagtigt som i VB. Du skal have din include path til at pege på det sted hvor din ADO-service er installeret, hvilket på min maskine er:

c:\\Program Files\\Common Files\\System\\ado

derefter anvender du VC++ #import i f.eks. stdafx.h

#import \"msado15.dll\" rename(\"EOF\",\"ADOEOF\")

og er er så en lille snippet jeg har fra noget andet jeg lavede i sommers:

ADODB::_CommandPtr spCommand(\"ADODB.Command\");
    spCommand->put_ActiveConnection(_variant_t(m_bstrConnection));
    spCommand->CommandText = L\"spMyStoredProcedure\";
    spCommand->CommandType = ADODB::adCmdStoredProc;
    spCommand->Parameters->Append(spCommand->CreateParameter(\"@strFirstParamter\", ADODB::adVarWChar, ADODB::adParamInput, 50*sizeof(TCHAR),CComVariant(bstrShortName)));
    spCommand->Parameters->Append(spCommand->CreateParameter(\"@idSecondParameter\", ADODB::adGUID, ADODB::adParamOutput,sizeof(GUID)));
    spCommand->Parameters->Append(spCommand->CreateParameter(\"@idOutputParameter\", ADODB::adGUID, ADODB::adParamOutput,sizeof(GUID)));
   
    spCommand->Execute(0, 0, ADODB::adExecuteNoRecords);

hvor jeg anvender et ADO command object til at eksekvere en stored procedure. Der er masser af VB-agtig doc på MSDN, til at anvende alm. recordsets, hvilket er nemmere end det viste. Eneste forskel er faktisk at man i C++ anvender \"->\" i stedet for VB\'s \".\" til at referere metoder og properties på det givne objekt. Du skal lægge mærke til at du skal have en ordentlig connection streng, som jeg bare har som et medlem på mit eget C++-objekt, men det kan du sikkert selv klare. Hygge
Avatar billede jpk Nybegynder
05. november 2001 - 21:23 #28
Man kan sagtens anvende MFC i en consol app!

Hvis du istedet vælger at anvende ADO, vil jeg anbefale at bruge en wrapper-class til alt det \"kedelige\", jeg har vist én et eller andet sted... (ellers kan du helt sikkert finde en på codeguru)

=> moykal
Man anvender nødvendigvis ikke \"->\" på objekter i C++ (faktisk kun på pointere til objekter), men også \".\" hvis det er \"direkte\" på objektet eller på en reference til et objekt!
Avatar billede moykal Nybegynder
05. november 2001 - 22:04 #29
Interessant info. Men de ADO-poiuntere der genereres ved det #import-direktiv jeg anvendte i ovenstående eksempel er COM-smartpointere - dvs. COM-pointere.

Så udover den interessante lekture, der ligger i at man i C++ kan dereferere objekter med \".\" men pointere med \"->\", så vil jeg lige rette mit eksempel ovenfor.

Hvis du ikke - ligesom i et MFC-eksempel - husker at kalde

CoInitialize(0);

ved program-start og

CoUninitialize();

ved program-slut (det er for at du skal træde ind i en såkaldt COM-appartment - kig evt. doc. på CoIninitalize/CoInitializeEx; nødvendigt for at kunne anvende nogen som helst form for COM/OLE/ActiveX (synonymer)).

Og lige en ting til. De såkaldte smartpointere jeg nævnte ER wrapper klasser der:

1) Kalder AddRef() i constructor og Release() i destructor
2) Mapper properties (der i virkeligheden også bare er smarte metode-indpakninger) om til lækker VB/C#-like notation.

=> jpk
Jeg behøver ikke nogen lektion i basal C++, men hvis du har noget, der ikke står i Stroustrup, Meyers etc. og for Windows/COM-specifikt Box, Grimes, Sells et. al. hører jeg gerne fra dig.

=> neuro
Du må undskylde forvirringen i ovenstående eksempel. Jeg anvender både typer, der hedder _variant_t og CComVariant der er pendanter i to forskellige verdener. Hvis du ikke selv skal skrive COM-servere så ignorer dette. De smartpointere, der genereres ved blot at skrive #import kaldes DTC-pointere (Direct To COM), og er mere omfattende (programmatisk nemmere) nemmere end ATL-pointere. Fordelen ved DTC-pointere er, at de gør som nævnt ovenfor, men tillige mapper de åndsvage fejl-returkoder om til C++-exceptions, så du kan anvende struktureret exception handling a la:

try {
  // Use ADO
}
catch (const _com_error &e) {
  // e har både Description, ErrorMessage mm. som
  // du vil kunne anvende til at få mere info
  // omkr. fejlhåndteringen.
}

Mht. MFC, så vil jeg anbefale dig at gå langt udenom. Der findes tons vis af kode skrevet i MFC, se f.eks. www.codeguru.com. Problemet er, at kerne-koden i MFC er præ-1992 C++, dvs. man har ikke været så forbandet opmærksom på f.eks. RTTI (RunTime Type Info) og man vælter sig derfor stadigvæk i skægge gamle makroer, hvilket virkeligt er en pain in the ass når man laver GUI-apps, og vil lave masser af forskellige views. Derudover er MFC virkeligt tungt. Hvis du gerne vil lave GUI på sigt, så kan jeg anbefale at gå en ud af to andre veje:

1) WTL. Windows Template Library. Doc kan hentes på http://www.develop.com/dm/dev_resources.asp, og det installeres med Platform SDK\'et, hvis du altså ønsker det. Fordelen er, at det er \"en anelse mere\" up to date. Alle de kendte klasser fra MFC er genimplementeret. Den eksekverbare kode er hurtigere og LANGT mindre. Koden ligner hindanden så meget, at det er nemt at portere, såfremt man har kodet ordentligt. Og så er der lige et lille issue omkr. trådning. For dem der har prøvet andet end on-idle implementeringer af baggrunds-processer og dermed følgende kommunikation med views vil vide hvad jeg taler om. Se doc\'en
2) Gå .NET vejen og anvend Windows-forms. Den seneste eller næst-seneste udgave af .NET-showet viser hvor nemt det er.
Avatar billede moykal Nybegynder
05. november 2001 - 22:07 #30
Avatar billede moykal Nybegynder
05. november 2001 - 22:11 #31
Platform SDK\'et er altid godt at have med sig, såfremt man koder mod Windows-platformen. Der er VIRKELIGT meget:

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

Og hvis du generelt vil have info om hvad der foregår der idag så:

www.msdn.microsoft.com
Avatar billede neuro Nybegynder
06. november 2001 - 12:12 #32
tak til alle for deres gode indlæg . jeg fik mest brug for den tutorial goz gav mig, men er glad for den viden jeg har fået om ado og mfc. tak til jer alle!
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