Avatar billede jonas82 Nybegynder
21. august 2003 - 16:20 Der er 29 kommentarer og
1 løsning

mysql og Visual Studio .NET C++

Hej eksperter.

Jeg vil gerne kunne komunikere med min mysql database igennem c++ programmer jeg laver vha. Visual Studio.

Jeg har ingen anelse hvordan jeg lige får Visual C++ til at arbejde sammen med mysql. En lille guide til dette ville være lækkert, og måske et par eksempler på queries.
Avatar billede arne_v Ekspert
21. august 2003 - 16:29 #1
Umiddelbart vil jeg mene at du har 2 oplagte muligheder:

1)  Det C API der kommer med MySQL

2)  ODBC kald (forudsætter MyODBC installeret)
Avatar billede jonas82 Nybegynder
21. august 2003 - 16:36 #2
Det lyder da godt at det i hvert fald kan lade sig gøre ;)

Men, jeg kommer nok til at skulle bruge en mere udførlig vejledning. Findes der en guide til hvordan jeg kommer igang med en af løsningerne. Helt fra downloade de rette filer, hvor de skal lægges, og hvad jeg skal include i mit projekt for at det virker.
Avatar billede jonas82 Nybegynder
21. august 2003 - 16:37 #3
Skal nok lige siges at jeg kun har arbejdet med mysql gennem php før, og jeg er ret ny til både c++ og Visual Studio.
Avatar billede arne_v Ekspert
21. august 2003 - 16:39 #4
Et eksempel på MySQL C API:

#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
21. august 2003 - 16:40 #5
Et eksempel på ODBC:

#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;
}

[det er til Access men ODBC er en standard - der er ikke noget
Access specifikt i koden, hvis DSN peger på en MySQL database, så
vil det også virke med den]
Avatar billede arne_v Ekspert
21. august 2003 - 16:42 #6
Ingen af løsningerne bruger noget som helst .NET specifikt.

De kan compiler med enhver C compiler på Win32 platform.

Der er nogen .NET ODBC klasser som nok kan gøre det samme som
mit sidste eksempel noget nemmere.

System.Data.Odbc tror jeg pakken hedder.
Avatar billede jonas82 Nybegynder
21. august 2003 - 16:50 #7
Jeg har prøvet at copy/paste dit mysql C API eksempel ind i et projekt, den kunne selvfølgelig ikke inklude mysql.h.
Jeg kan finde en mysql.h i mit mysql bibliotek under include. Skal jeg bare kopiere hele det inklude bibliotek ind i mit projekt, og så skifte #include "mysql.h" ud med #include "include/mysql.h"

Når jeg gør det, kommer der en del fejl.
Avatar billede arne_v Ekspert
21. august 2003 - 16:53 #8
Nej - du bør bede compileren om at lede efter include filer i det
directory (altså ikke kopiere).
Avatar billede arne_v Ekspert
21. august 2003 - 16:54 #9
Og du skal også bede den link med mysql lib filen.
Avatar billede jonas82 Nybegynder
21. august 2003 - 17:02 #10
Ok, det lader til at det her var lidt mere indviklet end jeg havde regnet med da jeg er blank mht dine sidste 2 kommentarer.

Vil du råde mig til helt at droppe det, eller er det slet ikke så indviklet når det kommer til stykket?

Mener du at jeg skal #include "C:\mysql\include\mysql.h" ?

"Og du skal også bede den link med mysql lib filen."
Det ved jeg ikke lige - jeg har en ganske almindelig standard mysql win installation i c:\mysql
Avatar billede arne_v Ekspert
21. august 2003 - 17:08 #11
Nej jeg mener at du bare skal bruge:

#include "mysql.h"

og så skal du bede compileren on at includere fra C:\mysql\include
directoriet.

Det er en projekt properties/setup ting.
Avatar billede arne_v Ekspert
21. august 2003 - 17:08 #12
Du har formentlig en linmysql.lib fil i dit mysql-træ.

Den skal VS linke med.
Avatar billede roo104 Nybegynder
21. august 2003 - 17:14 #13
Avatar billede jonas82 Nybegynder
21. august 2003 - 17:18 #14
Nej, men der er en libmySQL.lib i c:\mysql\lib\opt

Er det den rigtige? (håber linmysql.lib var en tastefejl) i så fald, hvad vil det sige at VS skal linke med den?
Avatar billede arne_v Ekspert
21. august 2003 - 17:21 #15
Det var en tyrk-fejl.

Ja.
Avatar billede jonas82 Nybegynder
21. august 2003 - 17:25 #16
ok, i tools/options/projects/vc++ Directories har jeg tilføjet c:\mysql\include til include files og c:\mysql\lib\opt til library files

Den brokker sig ikke over at den ikke kan finde mysql.h længere, men der kommer en del andre fejl.
Avatar billede jonas82 Nybegynder
21. august 2003 - 17:28 #17
c:\mysql\include\mysql_com.h(116): error C2501: 'st_net::SOCKET' : missing storage-class or type specifiers
c:\mysql\include\mysql_com.h(116): error C2501: 'st_net::fd' : missing storage-class or type specifiers
c:\mysql\include\mysql_com.h(180): error C2065: 'SOCKET' : undeclared identifier
c:\mysql\include\mysql_com.h(116): error C2146: syntax error : missing ';' before identifier 'fd'
c:\mysql\include\mysql_com.h(180): error C2146: syntax error : missing ')' before identifier 's'
c:\mysql\include\mysql_com.h(181): error C2059: syntax error : ')'
Avatar billede olly Nybegynder
21. august 2003 - 17:29 #18
Jeg har før brugt denne driver til at connecte til mysql fra c++ og c# på .net...

http://www.einfodesigns.com/shop.aspx
Avatar billede arne_v Ekspert
21. august 2003 - 17:31 #19
Den har også drillet mig den fejl.

/DSOCKET=int på kommando-linien.

Eller sæt:

#define SOCKET int

ind oven over:

#include "mysql.h"
Avatar billede jonas82 Nybegynder
21. august 2003 - 17:38 #20
Det forsvandt de fejl af, men nye opstod jeg kan ikke lige gennemskue hvad de skyldes.

testprojekt fatal error LNK1120: 10 unresolved externals
testprojekt error LNK2019: unresolved external symbol _mysql_free_result@4 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_fetch_lengths@4 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_fetch_row@4 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_num_fields@4 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_store_result@4 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_query@8 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_real_connect@32 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_error@4 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_init@4 referenced in function _main
testprojekt error LNK2019: unresolved external symbol _mysql_close@4 referenced in function _main
Avatar billede olly Nybegynder
21. august 2003 - 17:39 #21
Denne skulle også være okay...

http://sourceforge.net/projects/mysqldrivercs/
Avatar billede jonas82 Nybegynder
21. august 2003 - 17:45 #22
Til alle jer andre der kommer med input. Mange Tak!, men jeg prøver lige Arnes forslag igennem inden jeg forvirrer mig selv yderligere - Kan ikke overskue så mange ting på en gang ;)
Avatar billede arne_v Ekspert
21. august 2003 - 18:08 #23
De link fejl skyldes at du ikke linker mod libmysql.lib det sætter du
også i i project options.
Avatar billede jonas82 Nybegynder
21. august 2003 - 18:22 #24
Og hvordan gør man det? - øv jeg føler mig dum ;(.

Jeg har prøvet at sætte dette "C:\mysql\lib\opt" ind i 'mit projekt'/properties/linker/general/additional library directories/

Men det er stadig præscis de samme fejl, så jeg går ud fra det ikke var sådan jeg linker mod libmysql.lib.
Avatar billede arne_v Ekspert
21. august 2003 - 18:27 #25
Prøv og sæt C:\mysql\lib\opt\libmysql.lib ind !
Avatar billede jonas82 Nybegynder
21. august 2003 - 18:41 #26
Det give ingen forskel. Desværre
Avatar billede arne_v Ekspert
21. august 2003 - 18:47 #27
Når jeg nu nærlæser det du skriver (jeg har ikke selv VS.NET) så
er projekt/properties/linker/general/additional library directories/
jo nok kunn directoriet
 
C:\mysql\lib\opt

men så skal librariet:

libmysql.lib

angives et andet sted.

Formentligt også under projekt/properties/linker
Avatar billede jonas82 Nybegynder
21. august 2003 - 19:19 #28
Så, jeg addede det til commandline, nu compiler det, men når jeg kører det kommer der en stor fed windows advarsel:

This application has failed to start because LIBMYSQL.dll was not found. ...
Avatar billede arne_v Ekspert
21. august 2003 - 19:48 #29
Så er du næsten der !

Der er en libmysql.dll - den skal enten være i PATH eller i samme
directory som din EXE !
Avatar billede jonas82 Nybegynder
21. august 2003 - 19:52 #30
wohooo arne er Gud. Den er fint connected nu, og jeg fik hevet lidt ud af databasen.
Så skal jeg til at lege med det, for at lære mere :)

1000 TAK for din tid, tålmodighed og kompetence!
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
Computerworld tilbyder specialiserede kurser i database-management

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