Avatar billede .stx Nybegynder
16. juni 2003 - 00:20 Der er 23 kommentarer og
1 løsning

mysql og c++

Er der en som har lyst til at lave en BEGYNDER kode til mig som jeg kan sætte ind i dev-c++ og kompile.

Jeg har kigget lidt på gamle spørgsmål men kan simpelthen ikke finde hovede og hale i noget af det.

Jeg skal bruge et program, som kan vise nogle dataer fra min mysql server. Og helst ikke bare i en konsol, men som en form i windows.

Jeg har fundet ud af at inkludere mysql.h men har ikke engang præsteret at få nogle data ud i en simpel konsol.
Problemet er at jeg ikke kender grundlæggende c++ men er meget inde i php og vil godt videre med c++ altså ikke kun i/o koder.

Jeg har altså brug for en kode som jeg kan paste ind i dev-c++ (har osse borlands c++, med det er vidst noget af den samme kompiler) ændre det der nu skal ændres og kompile det.

.sTX
Avatar billede arne_v Ekspert
16. juni 2003 - 06:38 #1
Følgende eksempel:
  - bruger ODBC
  - er console ikke GUI
men det virker (og fordi ODBC er en standard er det ligegyldigt hvillken
database der bruges).

#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); 
  system("PAUSE");   
  return 0;
}
Avatar billede .stx Nybegynder
16. juni 2003 - 16:12 #2
Det er et fint script, og det ville sikkert osse virke hvis den da ikke fejlede i alle funktionerne fx SQLAllocEnv() og SQLAllocConnect()
Min php hjerne kan slet ikke regne fejlen ud. Men det er da første gang at jeg er kommet så langt :) Det virker som om at der mangler at bliver included en fil....:\

.sTX
Avatar billede arne_v Ekspert
16. juni 2003 - 16:26 #3
Får du fejl når du compiler ?

Eller skriver den "Error in ..." ud når du kører ?
Avatar billede .stx Nybegynder
16. juni 2003 - 16:37 #4
Det ser ud til at alle funktionerne ikke findes da alle funktionerne i koden ender ud i fejl.
[Linker error] undefined reference to `SQLAllocEnv@4'

[Linker error] undefined reference to `SQLAllocConnect@8'

[Linker error] undefined reference to `SQLConnect@28'
osv...

Det sker lige når kompilingen er ved at være færdig, den prøver faktisk at lave filen, men kan ikke.  C:\Program Files\Dev-Cpp\Makefile.win [Build Error]  [Projekt1.exe] Error 1

.sTX
Avatar billede arne_v Ekspert
16. juni 2003 - 16:49 #5
Project
Project Optiopns
Linker Options
-lodbc32
Avatar billede arne_v Ekspert
16. juni 2003 - 16:50 #6
Du har oprettet DSN og rettet den til ?
Avatar billede .stx Nybegynder
16. juni 2003 - 18:04 #7
Jep, er jeg meget sikker på! Selv om jeg ikke havde ville fejlen først komme efter jeg havde kompilede og prøvede at køre programmet.

Hvad var Project
Project Optiopns
Linker Options
-lodbc32
???

.sTX
Avatar billede arne_v Ekspert
16. juni 2003 - 18:12 #8
Du skal ind og ændre i projektets opsætning.

Det var de menu punkter du skal igennem og det sidste
var det der skulle sættes ind.
Avatar billede martinbk Nybegynder
23. juni 2003 - 21:15 #9
jeg har leget lidt med din kode arne_v den giver mig følgende output på en lokal SQL server.. som ER testet via mysql's egen console

Error in Connect
Error in AllocStmt
Error in ExecDirect
Error in BindCol
Error in BindCol
Avatar billede arne_v Ekspert
23. juni 2003 - 22:07 #10
connect er den første som fejler, hvilket antyder at
dsn, un eller pw er forkerte.

Du har oprettet DSN ?
Avatar billede martinbk Nybegynder
23. juni 2003 - 22:17 #11
ja... jeg får et output med følgende kode på min unix maskine

#include "/usr/local/include/mysql/mysql.h"
#include <stdio.h>


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

    int num_fields;
    int i;

    if(mysql_handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    if(!mysql_real_connect(mysql_handle, "min server", "un", "pw", "db", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    mysql_query(mysql_handle, "SELECT cd_nr, artist, titel FROM numre");

    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++) {
            printf("[%.*s]", (int) lengths[i], row[i] ? row[i] : "NULL");
        }
        printf("\n");

    }

    mysql_free_result(result);
    mysql_close(mysql_handle);

    return 1;
}

men koden giver en fejl på min windows selvom jeg ændrer min include til C:/mysql/include/mysql.h
Avatar billede arne_v Ekspert
23. juni 2003 - 22:23 #12
Nu er jeg lidt forvirret.

Min kode bruger ODBC kald (og skal bruge en DSN).

Din kode bruger native mysql kald (og skal derfor ikke bruge en DSN).
Avatar billede martinbk Nybegynder
23. juni 2003 - 22:28 #13
hmm nu lyder jeg dum (er jeg sikkert også) men DSN?¿?
Avatar billede arne_v Ekspert
23. juni 2003 - 22:31 #14
Når man bruger ODBC så definerer man en DSN i Windows's ODBC Manager
program (giver et navn som peger på en database) og lader sit program
connecte til DSN navnet.
Avatar billede martinbk Nybegynder
23. juni 2003 - 22:41 #15
ahh har fundet det.. eneste problem er jeg ikke kan få lov at lave en DSN mod min SQL server.. hverken den lokale windows eller min unix SQL
Avatar billede martinbk Nybegynder
23. juni 2003 - 22:47 #16
Microsoft SQL Server ODBC Driver Version 03.81.9030

Running connectivity tests...

Attempting connection
[Microsoft][ODBC SQL Server Driver][TCP/IP Sockets]General network error. Check your network documentation.

serveren kører på localhost
Avatar billede martinbk Nybegynder
23. juni 2003 - 23:37 #17
weee fik min ODBC til at virke... tænkte på om du evt. ville kommenterer din kode for os begyndere... hvad der sker hvor etc :)
Avatar billede arne_v Ekspert
24. juni 2003 - 06:56 #18
Selvfølgelig.

Senere idag.

Stay tuned.
Avatar billede arne_v Ekspert
24. juni 2003 - 18:34 #19
#include <iostream>

using namespace std;

#include <stdlib.h>

#include <windows.h>
// to header filer der er nødvednige for at kunne lave ODBC kald
#include <sql.h>
#include <sqlext.h>

// DSN + brugernavn + kodeord (jeg har testet mod en Access database, men alt kan bruges)
char* dsn = "TestMSAccess";
char* un = "";
char* pw = "";
// en stump SQL som jeg vil teste med
char* sqlstr = "SELECT * FROM T1";

int main(int argc, char *argv[])
{
  SQLHENV Environment;
  SQLHDBC DataBaseConnect;
  SQLHSTMT stmt;
  SQLRETURN stat;
  // initialiser ODBC
  stat = SQLAllocEnv(&Environment);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in AllocEnv" << endl;
  // alloker connection
  stat = SQLAllocConnect(Environment,&DataBaseConnect);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in AllocConnect" << endl;
  // connect til database
  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;
  // alloker statement
  stat = SQLAllocStmt(DataBaseConnect,&stmt);
  if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) cerr << "Error in AllocStmt" << endl;
  // udfør SQL sætning
  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];
  // første kolonne skal gemmes i integer variablen i
  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;
  // anden kolonne skal gemmes i char arrayet s
  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;
  // kør i løkke (indtil vi udfører break)
  for(;;) {
    // hent række
    stat = SQLFetch(stmt);
    // hop ud hvis ikke flere data
    if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) break;
    // udskriv data
    s[sl] = '\0';
    cout << i << " " << s << endl;
  }
  // frigør divers eressourcer
  SQLFreeStmt(stmt,SQL_DROP);
  SQLDisconnect(DataBaseConnect);
  SQLFreeConnect(DataBaseConnect);
  SQLFreeEnv(Environment); 
  system("PAUSE");   
  return 0;
}

tabel T1 har 2 felter et INTEGER og et VARCHAR.
Avatar billede martinbk Nybegynder
24. juni 2003 - 18:58 #20
det gav da ihvertfald en smule afklaring, takker... tænkte på om du har et link til nogle referancer for sql.h og sqlext.h headerne (kunne ikke finde noget på cpluscplus.com)
Avatar billede arne_v Ekspert
11. juli 2003 - 19:05 #22
stx>

Måske tid at lukke spørgsmålet ?
Avatar billede arne_v Ekspert
22. juli 2003 - 22:44 #23
??
Avatar billede .stx Nybegynder
14. januar 2005 - 09:15 #24
Sorry, fandt lige pludeselig ud af at sprøgsmålet var åbent!
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