Avatar billede d34c0n Praktikant
09. oktober 2003 - 17:42 Der er 13 kommentarer og
1 løsning

Hjælp til mySQL?

Hej.

Jeg har hentet mysql++ lib'et og ved godt der følger nogle eksempler med, men jeg kan ikke lige få det til at virke.

Så kan nogen vise mig et helt stykke kode som kan compiles med VC++ 6.0 og som viser hvordan jeg indsætter, sletter, og redigerer tables og indhold i min database?
Vis også hvordan jeg connecter osv. altså det skal være noget kode som virker udfra det jeg har udskiftet database name, password osv. med.
Avatar billede arne_v Ekspert
09. oktober 2003 - 18:24 #1
Skal det være mysql++ librariet ? Du kan ikke bare bruge det normale
C API (som virker fint i C++) ?
Avatar billede d34c0n Praktikant
09. oktober 2003 - 18:26 #2
Det er lige meget hvilket library der bruges, bare jeg får at vide hvilket det er.
Avatar billede arne_v Ekspert
09. oktober 2003 - 18:29 #3
Det her eksempel virker:

#include <stdio.h>
#include <stdlib.h>

#include "mysql.h"

int main()
{
    MYSQL *handle;
    MYSQL_RES *result;
    MYSQL_ROW row;
    int nfields;
    int *l;
    int i;
    handle= mysql_init(NULL);
    if(handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(handle));
        exit(1);
    }
    if(!mysql_real_connect(handle, "localhost", "", "", "Test", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(handle));
        exit(1);
    }
    mysql_query(handle, "SELECT * FROM T1");
    result = mysql_store_result(handle);
    nfields = mysql_num_fields(result);
    while ((row = mysql_fetch_row(result))) {
        l = (int *)mysql_fetch_lengths(result);
        for (i=0; i<nfields; i++) {
            printf(" %.*s", l[i], row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }
    mysql_free_result(result);
    mysql_close(handle);
    return 0;
}
Avatar billede arne_v Ekspert
09. oktober 2003 - 18:32 #4
Du skal:
  - fortælle compileren at den skal lede efter include filer i \mysql\include
  - du skal linke mod \mysql\lib\opt\libmysql.lib
  - når programmet køres skal \mysql\lib\opt\libmysql.dll være i path
Avatar billede d34c0n Praktikant
09. oktober 2003 - 23:14 #5
Jeg kunne ikke få dit til at virke, men jeg fandt et andet eks:

int main()
{
   
    MYSQL* mysql_handle = mysql_init(NULL);
    MYSQL_RES *result;

    if(mysql_handle == NULL){
    cout << "Fejl: " << mysql_error(mysql_handle);
    exit(1);
    }

    if(!mysql_real_connect(mysql_handle, "macrotech.dk", "macrotech", "password", "macrotech", 0, NULL, 0)){
    cout << "Fejl: " << mysql_error(mysql_handle);
    exit(1);
    }

    if(!mysql_query(mysql_handle, "SELECT id,data FROM user")){
    cout << "Fejl: " << mysql_error(mysql_handle);
    exit(1);
    }else{
    // Ingen fejl fundet - viser data
    MYSQL_ROW row;
    unsigned int num_fields;
    unsigned int i;
         
    result = mysql_store_result(mysql_handle);
    num_fields = mysql_num_fields(result);
      while((row = mysql_fetch_row(result))){
      unsigned long *lengths;
      lengths = mysql_fetch_lengths(result);
        for(i = 0; i < num_fields; i++){
        cout << lengths[i] << row[i] << row[i];
        }
           
      }
      }
 
    mysql_free_result(result); 
    mysql_close(mysql_handle);

    return 0;

}

Men den siger når jeg prøver at connecte:
"Access denied for user 'localhost@........' <Using password: YES>"

Hvad er der så galt? :/
Avatar billede arne_v Ekspert
10. oktober 2003 - 08:21 #6
Min kode er altså brugt flere gange.

Det er dog muligt at du lige skal sætte en:

#defien SOCKET int

ind øverst.
Avatar billede arne_v Ekspert
10. oktober 2003 - 08:22 #7
Fejlen siger at der er forsøgt at connecte med brugernavn localhost.

Hvilket er lidt mystisk da den kode du har postet ikke indeholde
localhost.

Har du blandet den kode og min kode lidt ?
Avatar billede chapter Nybegynder
14. oktober 2003 - 15:15 #8
Lige et indskudt spørgsmål til denne tråd: Er det uhensigtsmæssigt at benyttes MFC's CRecordset og få tilgang til db'en via en ODBC driver?? Tilsynesladende understøtter MySQLs ODBC driver kun snapshot og ikke dynaset, men jeg ved ikke hvor stort et problem det bliver i længden (newbie i SQL databaser). Bemærk venligst, at basen ikke skal benyttes kommercielt men kun til en form for test af prototype - ikke desto mindre kunne jeg da godt tænke mig at vide Jeres holdning til MFCs CRecordset og ODBC drivere fremfor andre fremgangsmetoder såsom ovenstående API library...
Avatar billede arne_v Ekspert
14. oktober 2003 - 15:22 #9
Ddet er jo en lidt dybere stak: MFC bruger MySQL ODBC og MySQL ODBC bruger
MySQL C API.

Men jeg tror faktisk ikke at det betyder meget performance-mæssigt.

Så hvis du kan lide MFC's funktionalitet, så kan jeg ikek se hvorfor du
ikke skulle bruge MFC.
Avatar billede chapter Nybegynder
14. oktober 2003 - 20:22 #10
..og lige den (forhåbenligt0) sidste:
Er det hensigtsmæssigt at oprette og nedlægge CRecordset nedarvninger (i snapshot mode) flere gange i et program eller er det meningen de skal oprettes een gang i "master" constructoren og nedlægges i "master" destructoren?? Jeg har læst at når der benyttes snapshot, at tabellen som CRecordset objektet binder sig til, kopieres til hukommelsen (snapshot), men det giver vel ingen mening at oprette samtlige tabeller og allokere dem i hukommelesen eller hvad ???! Jeg har ikke kunnet finde noget om "best practices" vedr. MFCs CRecordset, så jeg er temmeligt meget i tvivl om hvad der er den bedste metode.
Avatar billede arne_v Ekspert
14. oktober 2003 - 20:27 #11
Der må jeg blive dig svar skyldig.

Jeg har aldrig selv brugt de MFC klasser.
Avatar billede chapter Nybegynder
15. oktober 2003 - 08:36 #12
øv bøv.. jeg leder videre på nettet. Hvis jeg finder "facit" så dropper jeg det her..
Avatar billede d34c0n Praktikant
16. oktober 2003 - 15:54 #13
lukkes...
Avatar billede chapter Nybegynder
23. oktober 2003 - 20:50 #14
Som lovet så bringer jeg feedback på mit eget spørgsmål - se ovenstående..
MFCs recordset virker formidabelt og uden de store problemer, hastigheden er i top og det virker uden de stor krumspring.
En tjekliste for at komme op at køre..

1) Få fat i adgangsinfo til Database og dennes ip
2) Installer ODBC driver som kan køre med databasen og sæt en data source profil op
3) Lav dit MFC projekt
4) Lav et object som nedarver fra CRecordset - Du vil blive promptet for hvilken tabel og hvilken data source du ønsker at benytte. Vælg kun een tabel, dvs. der skal oprettes lige så mange objekter som der er tabeller.
5) Opret en generel forbindelse i hovedlaget som håndtere database-tilgang med (xxx = Data source name)

.h:
private:
    CDatabase m_dbDatabase;
.cpp:

Constructor
m_dbDatabase.OpenEx("DSN=xxx",CDatabase::noOdbcDialog | CDatabase::useCursorLib);       
m_dbDatabase.SetSynchronousMode(TRUE);

Destructor
m_dbDatabase.Close();

6) Når der ønskes tilgang til den enkelte tabel instantieres objektet der knytter sig til denne ved

Delete :
ODBCTable1 tab1(&m_dbDatabase);
// Dette filter sættes automatisk ind efter SQL kommandoen WHERE
tab.m_strFilter = "PrimKey = '" + key.ToString() + "'";
tab.Open(CRecordset::snapshot);
tab.Delete();

Create :
ODBCTable1 tab1(&m_dbDatabase);
tab.Open(CRecordset::snapshot);
tab.AddNew();
tab.m_PrimKey = "bla bla";
tab.m_Field1 = ..
tab.m_Field2 = ..
tab.Update();

Edit :
ODBCTable1 tab1(&m_dbDatabase);
// Dette filter sættes ind efter SQL kommandoen WHERE
tab.m_strFilter = "PrimKey = '" + key.ToString() + "'";
tab.Open(CRecordset::snapshot);
tab.Edit();
tab.m_Field1 = ..
tab.m_Field2 = ..
tab.Update();

7) Alle funktioner kaster exception hvis problemer som bare kan gribes med en try/catch - giver udemærkede fejlbeskeder..

8) A word of caution to this tale:
Hvis der benyttes DATETIME i SQL (CTime i MFC) så husk at initialisere CTime i constructoren på CRecordsæt nedarvningen ellers crasher systemet..
Husk ikke at benytte keywords som feltnavne så som Index og Key

Det var så de erfaringer jeg har høstet indtil videre - håber der er nogen som engang vil få brug for det ;-)
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