Avatar billede quiw Nybegynder
18. januar 2006 - 14:10 Der er 26 kommentarer og
1 løsning

Microsoft Access..

Goddag Eksperter..
Jeg vil gerne loade/skrive noget data til en .mdb database .. Den kører på bare som fil på samme computer, så intet med netværk.
- Men, findes der nogle tutorials til at bruge microsoft access API´et?..
Vil nemlig gerne bruge et lille eksempel på hvordan jeg f.eks. loader noget lign. fra en tabel:
Navn, Lvl, Password
Og eventuelt hvordan man skriver til dem/opretter nye tabeller fra c++ programmet..

Mvh. Quiw
Avatar billede arne_v Ekspert
18. januar 2006 - 19:16 #1
hvis du kan leve med et lidt ældre database API, så er ODBC relativt nemt at bruge

se http://www.eksperten.dk/artikler/207
Avatar billede quiw Nybegynder
18. januar 2006 - 22:05 #2
arne_v - Mange tak, fulgte guiden .. Og fik denne kode brygget sammen:

#include <stdio.h>
/* Header filer til Database.*/
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
/* Header filer til Database.*/

/*
* åben connection til:
*    driver = "{Microsoft Access Driver (*.mdb)}"
*    database = "D:\\Database\\MSAccess\\database.mdb"
*    username = "Admin"       
*    password = ""
*/
      char outconstr[1024]; // Returned connection string
      int outconlen; // Length of returned connection string
      char sqlstr[200]; // Insert
      char *constr = "Driver={Microsoft Access Driver (*.mdb)};Dbq=database.mdb;Uid=Admin;Pwd=";
      SQLHENV Environment; //ODBC enviroment
      SQLHDBC DataBaseConnect; //ODBC Connection
      SQLHSTMT stmt; //ODBC Statement
      SQLRETURN stat; //ODBC Return status
     
void databaseloader()
{
      /* alloker environment = initialiser ODBC */
      stat = SQLAllocEnv(&Environment);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocEnv\n");
      }
      /* connect til database */
      stat = SQLAllocConnect(Environment,&DataBaseConnect);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocConnect\n");
      }
      stat = SQLDriverConnect(DataBaseConnect,NULL,
                              (SQLCHAR *)constr,(SQLSMALLINT)strlen(constr),
                              (SQLCHAR *)outconstr, (SQLSMALLINT)sizeof(outconstr),
                              (SQLSMALLINT *)&outconlen,SQL_DRIVER_COMPLETE);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in Connect\n");
      }
      /* alloker statement */
      stat = SQLAllocStmt(DataBaseConnect,&stmt);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocStmt\n");
      }
}

void databaseshutdown()
{
      /* frigør statement */
      SQLFreeStmt(stmt,SQL_DROP);
      /* disconnect og frigør connection */
      SQLDisconnect(DataBaseConnect);
      SQLFreeConnect(DataBaseConnect);
      /* frigør environment */
      SQLFreeEnv(Environment);
}

void writetodb(int line, char *text)
{
      sprintf(sqlstr,"INSERT INTO 1 VALUES(%d,'%s')",line,text); //1 = tabel, line = tabelnummer, saHEJ = Tekst.
      stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
          printf("Could not write data. \n");
      }
      else
      {
          printf("Data was written succesful \n");
      }
}
int main()
{
      databaseloader();
      //Indsætter tabeldata
      writetodb(1,"Spis ild!"); // Line, Text
      databaseshutdown();
      system("pause");
      return 0;
}

- Men, har stadig en del spørgsmål:
#1 - Hvordan skriver jeg til en anden kolonne end bare den samme?
#2 - Hvordan overskriver jeg gammelt data?, den vil nemlig ikke skrive hvis der står noget på feltet i forvejen.
#3 - Læsning af en variable i tabellen? hvordan gør jeg det? og hvis jeg eventuelt vil søge efter noget? (Skal nemlig lave et login hvor den gerne sku søge efter brugeren og finde koden)

- Ville være meget dejligt hvis jeg kunne få svar på de spørgsmål, på forhånd tak.
Avatar billede arne_v Ekspert
18. januar 2006 - 22:15 #3
re 1)

du INSERT'er altid en helt række med en antal kolonne rsom du angiver i VALUES

re 2)

UPDATE sætning

re 3)

SELECT med en WHERE betingelse
Avatar billede quiw Nybegynder
18. januar 2006 - 22:39 #4
1) Har prøvet at ændre "INSERT INTO 1 VALUES(%d,'%s')" til INSERT INTO 1 testvalue(%d,'%s')",

- Men den vil ikke skrive til testvalue, den siger bare "Could not write data"

2)
- Kan du give et par korte linjer kode på hvordan jeg bruger update?

3)
- Kan du igen, give et lille kort kode eksempel.. Hehe ..
Avatar billede arne_v Ekspert
18. januar 2006 - 22:44 #5
UPDATE tabelnavn SET feltnavn = værdi WHERE andetfelt = andenværdi
Avatar billede arne_v Ekspert
18. januar 2006 - 22:44 #6
artiklen har et eksempel på SELECT
Avatar billede arne_v Ekspert
18. januar 2006 - 22:46 #7
Hvis du vil indsætte en ny række med værdier i alle kolonner er det:

INSERT INTO tabelnavn VALUES(værdi_1,...,værdi_n)

hvis du vil indsætte en ny række med værdier i nogle af felterne er det:

INSERT INTO tabelnavn (felt_1,...,felt_m) VALUES(værdi_1,...,værdi_m)
Avatar billede quiw Nybegynder
18. januar 2006 - 22:46 #8
Du må undskylde, det giver slet ingen mening for mig..
Kan jo umiddelbart ikke bare skrive:
/* kode kode kode */
Update testvalue;
/* kode kode kode */

- Hehe, håber du bærer over min uvidenhed.
Avatar billede arne_v Ekspert
18. januar 2006 - 22:49 #9
nej men du kan bruge

sprintf(sqlstr,"UPDATE mintabel SET %s = %d, %s = '%s'",etfelnavn,ettal,etandetfeltnavn,entekst);
stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
Avatar billede quiw Nybegynder
18. januar 2006 - 23:05 #10
Årh er ved at koge i stumper, mit program crasher konstant.
Kan bare ikke få noget af det til at fungere.
Hvis nu .. Jeg har en tabel der ser sådan her ud:

ID  testt1  testt2  testt2
1    Hej1      hej2    hej3
2    Hej4      hej5    hej6

Hvad skal jeg så helt eksakt skrive for at f.eks. reade/update "Hej6"?
- Kan bare ikke forstå det :/
Avatar billede quiw Nybegynder
18. januar 2006 - 23:11 #11
Hov .. Den ene kolonne skal hedde testt3 ..
Avatar billede quiw Nybegynder
19. januar 2006 - 15:18 #12
Hm, har umiddelbart rodet længe med det selv ..
- Har brug for et svar at gå efter ..
Avatar billede arne_v Ekspert
19. januar 2006 - 15:51 #13
sprintf(sqlstr,"UPDATE dintabel SET testt3 = %s WHERE id = %d", "ikkehej6", 2);
stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));

boer opdatere
Avatar billede quiw Nybegynder
19. januar 2006 - 18:43 #14
Okay, jeg har prøvet nu og det virker stadig ikke :S
Hvad gør jeg galt?
Og Min kode ser sådan her ud:

#include <stdio.h>

/* Header filer til Database.*/
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
int main()
{     
      char outconstr[1024]; // Returned connection string
      int outconlen; // Length of returned connection string
      char sqlstr[200]; // Insert
      char *constr = "Driver={Microsoft Access Driver (*.mdb)};Dbq=database.mdb;Uid=Admin;Pwd=";
      SQLHENV Environment; //ODBC enviroment
      SQLHDBC DataBaseConnect; //ODBC Connection
      SQLHSTMT stmt; //ODBC Statement
      SQLRETURN stat; //ODBC Return status
      stat = SQLAllocEnv(&Environment);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocEnv\n");
      }
      stat = SQLAllocConnect(Environment,&DataBaseConnect);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocConnect\n");
      }
      stat = SQLDriverConnect(DataBaseConnect,NULL,
                              (SQLCHAR *)constr,(SQLSMALLINT)strlen(constr),
                              (SQLCHAR *)outconstr, (SQLSMALLINT)sizeof(outconstr),
                              (SQLSMALLINT *)&outconlen,SQL_DRIVER_COMPLETE);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in Connect\n");
      }
      stat = SQLAllocStmt(DataBaseConnect,&stmt);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocStmt\n");
      }
      sprintf(sqlstr,"UPDATE tabel SET test3 = %s WHERE id = %d", "hejmeddig",25);
      stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
     
      SQLFreeStmt(stmt,SQL_DROP);
      SQLDisconnect(DataBaseConnect);
      SQLFreeConnect(DataBaseConnect);
      SQLFreeEnv(Environment);
      system("pause");
      return 0;
}
Avatar billede arne_v Ekspert
19. januar 2006 - 20:04 #15
Fejl ?

Retur kode i stat ?
Avatar billede quiw Nybegynder
19. januar 2006 - 22:30 #16
Hehe .. Har ingen idé, forstår knap nok halvdelen af det. Vil egentlig bare have det til at virke da jeg ikke regner med at skulle arbejde så meget med database. (Er HTX studerende)
- Mit mål med dette projekt er bare at lave en funktino til skrivning og læsning af database. Hehe, men ville se om jeg selv kunne sætte mig ind i det først.
Avatar billede quiw Nybegynder
20. januar 2006 - 16:06 #17
Har tilføjet:
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in Update\n");
      }

- Men det virker stadig ikke :S
Avatar billede quiw Nybegynder
21. januar 2006 - 14:52 #18
Gik spørgsmålet dødt?.. Ingen hjælp?
Avatar billede arne_v Ekspert
23. januar 2006 - 14:08 #19
Det haender at jeg har andet at lave end at vaere her.

Uden mere praecise opklysninger end "og det virker stadig ikke" kommer vi ikke
videre.
Avatar billede quiw Nybegynder
23. januar 2006 - 15:12 #20
Havde nu engang heller ikke forventet at du var her hele tiden ;)
- Men kunne jo være nogle havde en løsning.

- Det er eksakt det som er mit problem, jeg ved ikke hvorfor det ikke virker.
  Når compillere programmeret kører det fint, men der bliver ikke skrevet noget til  databasen, jeg får bare fejlen "Error in update". Hvilket jo skulle mene at der var en fejl i update, men hvilken? Kan ikke præcisere hvad fejlen er, da det er mit problem.
Avatar billede arne_v Ekspert
23. januar 2006 - 15:55 #21
udskriv stat saa kan vi se hvilken kode det er og derfra muligvis se hvilken fejl det er
Avatar billede quiw Nybegynder
24. januar 2006 - 09:05 #22
Jeg kan ikke udskrive stat, den compilere fint med cout << " "<<stat<<" \n"; men når man kører programmet kommer microsoft med "Programmet har medført en fejl, undlad at sende?" osv ..
Avatar billede quiw Nybegynder
24. januar 2006 - 23:49 #23
Arne - Jeg fik Update, INSERT og DELETE til at virke nu :)
- Men kan stadig ikke få SELECT til at virke .. Har prøvet
"SELECT * FROM test1", men hvordan får jeg det ind i en variabel? F.eks. en Char.
Avatar billede quiw Nybegynder
24. januar 2006 - 23:50 #24
Du må forresten også godt smide et svar, du har jo hjulpet mig en del på rette vej, så forstår det meste af det nu :) Mangler bare select. (Ved godt der er et eksempel på det link du gav, men vil hellere have et mere konkret og simpelt eksempel på hvordan jeg loader 1 linie ind i en variabel)
Avatar billede arne_v Ekspert
25. januar 2006 - 00:16 #25
/* SQL */
  char sqlstr[100];
  sprintf(sqlstr,"SELECT test3 FROM tabel WHERE id = %d", "hejmeddig",2);
  stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
  {
      printf("Error in ExecDirect\n");
  }
  /* kolonne 1 skal hentes ind i s */
  char s[50];
  int sl;
  stat = SQLBindCol(stmt,1,SQL_C_CHAR,s,sizeof(s),(SQLINTEGER *)&sl);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
  {
      printf("Error in BindCol\n");
  }
  /* hent alle rækker */
  for(;;)
  {
      stat = SQLFetch(stmt);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) break;
      s[sl] = '\0';
      /* nu indeholder s kolonne 1 */
  }
Avatar billede arne_v Ekspert
25. januar 2006 - 00:21 #26
og et svar
Avatar billede quiw Nybegynder
25. januar 2006 - 08:19 #27
Mange tak .. :)
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