Avatar billede sunep Nybegynder
14. april 2003 - 10:58 Der er 23 kommentarer og
1 løsning

Mysql tilgang osv.

Nu har jeg læst og læst indlæggende omkring mysql her på eksperten.dk

Men jeg har stadig ikke kunne finde ud af hvordan det er nemmest/smartest at arbejde med mysql via c++ jeg bruger borland c++ builder 6

Det jeg gerne vil er at kunne udføre querys og få adgang til resultatet af de querys relativt nemt..

Er der nogen der kan hjælpe med alt det. altså connection og hvordan jeg udfører querys.
Avatar billede arne_v Ekspert
14. april 2003 - 12:08 #1
Min anbefaling er:
  - installer MySQL ODBC
  - brug standard ODBC kald

Rimeligt nemt at lave queries med.

Og koden skulle være rimelig portabel mellem forskellige databaser
og forskellige C++ compilere.

Det er ikke sikkrt, at du har brug for det lige nu. Men det må da tælle
positivt.
Avatar billede sunep Nybegynder
14. april 2003 - 12:34 #2
og hvordan laver du standard odbc kald.. er der nogle eksempler du/i kan vise
Avatar billede arne_v Ekspert
14. april 2003 - 12:42 #3
Du starter med at checke om du sql.h og sqlext.h.

Hvis ja så er du klar. Hvis nej så downloader du ODBC SDK fra
Microsoft.

Altså:

#include <sql.h>
#include <sqlext.h>

Så laver vi en connection:

  SQLHENV Environment;
  SQLHDBC DataBaseConnect;

  stat = SQLAllocEnv(&Environment);
  stat = SQLAllocConnect(Environment,&DataBaseConnect);
  stat = SQLConnect(DataBaseConnect,
                    dsn,strlen(dsn),
                    un,strlen(un),
                    pw,strlen(pw));

Og udføre en query:

  SQLHSTMT stmt;
  stat = SQLAllocStmt(DataBaseConnect,&stmt);
  stat = SQLExecDirect(stmt,sqlstr,strlen(sqlstr));
  // hent data
  SQLFreeStmt(stmt,SQL_DROP);

Og lukke connection:

  SQLDisconnect(DataBaseConnect);
  SQLFreeConnect(DataBaseConnect);
  SQLFreeEnv(Environment);
Avatar billede sunep Nybegynder
14. april 2003 - 12:44 #4
kan du ikke forklare det lidt nærmere.. jeg synes det er meget ikke gennemskueligt
Avatar billede arne_v Ekspert
14. april 2003 - 12:47 #5
Og // kommentaren må skulle se ud noget som:

stat = SQLBindCol(stmt,colno,type,buf,buflen,&retlen);

stat = SQLFetch(stmt);
Avatar billede sunep Nybegynder
14. april 2003 - 12:50 #6
okay... jeg fatter hat af det her. sqlstr er det din sql query?
Avatar billede arne_v Ekspert
14. april 2003 - 12:52 #7
Jeg prøver lige at kigge feter nogle god eeksmepler.

Microsft har selv et Foxpro eksempel på:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/usgvodbc_15.asp

men jeg syne sikke at det er specielt godt.
Avatar billede arne_v Ekspert
14. april 2003 - 12:53 #8
Ja - sqlstr er SQL kommandoen.
Avatar billede sunep Nybegynder
14. april 2003 - 12:59 #9
kan du ikke lave ovenstående eksempel lidt om så disse oplysninger bruges.. så tror jeg bedre at jeg forstår det

DSNNAVN = testdns
query = select testrow from testtable
og det data jeg får ud skal smides i en listbox eller noget
Avatar billede arne_v Ekspert
14. april 2003 - 13:04 #10
Jeg prøver lige at lave et komplet lille eksempel.
Avatar billede sunep Nybegynder
14. april 2003 - 13:06 #11
det ville være kanont
Avatar billede arne_v Ekspert
14. april 2003 - 13:24 #12
Her er et komplet eksempel der virker hos mig:

#include <iostream>

using namespace std;

#include <stdlib.h>

#include <windows.h>
#include <sql.h>
#include <sqlext.h>

char* dsn = "TestMSAccess";
char* un = "";
char* pw = "";
char* sqlstr = "SELECT * FROM T1";

int main(int argc, char *argv[])
{
  SQLHENV Environment;
  SQLHDBC DataBaseConnect;
  SQLHSTMT stmt;
  SQLRETURN stat;
  stat = SQLAllocEnv(&Environment);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in AllocEnv" << endl;
  stat = SQLAllocConnect(Environment,&DataBaseConnect);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in AllocConnect" << endl;
  stat = SQLConnect(DataBaseConnect,
                    (SQLCHAR *)dsn,strlen(dsn),
                    (SQLCHAR *)un,strlen(un),
                    (SQLCHAR *)pw,strlen(pw));
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in Connect" << endl;
  stat = SQLAllocStmt(DataBaseConnect,&stmt);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in AllocStmt" << endl;
  stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in ExecDirect" << endl;
  int i,il,sl;
  char s[10];
  stat = SQLBindCol(stmt,1,SQL_C_LONG,&i,sizeof(i),(SQLINTEGER *)&il);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in BindCol" << endl;
  stat = SQLBindCol(stmt,2,SQL_C_CHAR,s,sizeof(s),(SQLINTEGER *)&sl);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in BindCol" << endl;
  for(;;) {
    stat = SQLFetch(stmt);
    if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) break;
    s[sl] = '\0';
    cout << i << " " << s << endl;
  }
  SQLFreeStmt(stmt,SQL_DROP);
  SQLDisconnect(DataBaseConnect);
  SQLFreeConnect(DataBaseConnect);
  SQLFreeEnv(Environment); 
  return 0;
}
Avatar billede arne_v Ekspert
14. april 2003 - 13:25 #13
Du skal ikek lade dig skræmme af de mange linier med de meget
lange navne og argument-lister.

Det meste af det er det samme hver gang.
Avatar billede sunep Nybegynder
14. april 2003 - 13:40 #14
tak for det.. jeg tror jeg har lidt bedre fat i det nu.. lige to ting så tror jeg det er det..

1. har du et link der kan forklare lidt omkring SQLBindCol´s argumenter eller kan du forklare lidt omkring dem

2. er det muligt at bruge samme metoder med uden ODBC men med DSNLESS
Avatar billede arne_v Ekspert
14. april 2003 - 13:44 #15
stat = SQLBindCol(stmt,2,SQL_C_CHAR,s,sizeof(s),(SQLINTEGER *)&sl);

stmt = ODBC et eller andet - skal bare være der
2 = kolonne 2
SQL_C_CHAR = tekst kolonne
s = hvor fetch skal gemme data
sizeof(s) = hvor meget data fetch maksimalt må gemme
sl = hvor fetch skal gemme den faktiske længde
Avatar billede arne_v Ekspert
14. april 2003 - 13:45 #16
(jeg skal måske lige nævne at tabellen i mit eksempel har 2 felter -
1 integer og 1 tekst)
Avatar billede arne_v Ekspert
14. april 2003 - 13:45 #17
Dit andet spørgsmål kan jeg ikke svare på. Så skrap er jeg heller
ikke til ODBC.
Avatar billede sunep Nybegynder
14. april 2003 - 13:49 #18
ok.. det er i orden.. det er bare det at det er ikke så fedt at hvis man skal lave et program der snakker med en mysql eller access database.. så er det ikke så smart at alle dem der vil bruge programmet selv skal sætte en odbc op :)
Avatar billede arne_v Ekspert
14. april 2003 - 13:55 #19
Det kan jeg godt se.

Men der er formentligt også en måde at gøre der på.

Men der skal du nok hve fat på noget dokoumentation.
Avatar billede sunep Nybegynder
14. april 2003 - 13:57 #20
meget kan man sige... men det er fandme nemmere at lave en ado connection med VB istedet for det her. Men man skal jo lære det
Avatar billede arne_v Ekspert
14. april 2003 - 13:59 #21
Avatar billede arne_v Ekspert
14. april 2003 - 14:00 #22
Den nemme løsning er naturligvis at sætte DSN manuelt op sammen med
installationen af programmet.
Avatar billede arne_v Ekspert
14. april 2003 - 14:03 #23
ODBC kan godt være en lille smule tungt at komme igang med.

Og der er da også alternativer. MS VC++ har nogle MFC klasser.
Borland C++Builder har noget tilsvarende.

Men med ODBC så kan du frit vælge compiler: MS VC++, Borland C++Builder,
gratis Dev-Cpp etc., du kan frit vælge database - alle database
har en ODBC driver idag. Du kan sågar skifte platform fordi der er
blevet lavet ODBC drivere til Linux og diverse kommercielle Unix'er.
Samme kode virker overalt.
Avatar billede sunep Nybegynder
14. april 2003 - 14:45 #24
det er osse meget smart.. det vil jeg give dig ret i. men til små programmer er det måske en smule overkill :)
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