Avatar billede spiritusanta Nybegynder
19. januar 2004 - 15:33 Der er 13 kommentarer og
3 løsninger

Forbindelse til .mdb database

Jeg arbejder i programmet Borland C++ Builder 5.
Jeg har før hen arbejdet med paradox databaser, men som noget nyt er jeg gået igang med access databaser.

Jeg har først lavet programmet i Builder, herefter har jeg oprettet en database i programmet ms access, og tilsidst har jeg lavet et alias til databasen i programmet database desktop, som følger med C++.

Når jeg nu i C++ forsøger at skabe kontakt til databasen, bliver jeg spurgt om et pass og user, men har ikke lagt noget pass og user på databasen.

Når jeg så går ind i Database Desktop og kigger på mit alias, og vælger connect, står der
"Cannot load an IDAPI service"
"library."
"File: MSJT3032.DLL"

Vil hører om der er nogen her, der har fået succes med at få forbindelse til en access database (".mdb") og hvordan de gjorde det?
Avatar billede borrisholt Novice
19. januar 2004 - 15:38 #1
Jeg har noget Delphi kode der kan. Det kan du bare bruge i dit C++ Builder projekt.

Skriv hvis der har interesse.
Jens B
Avatar billede spiritusanta Nybegynder
19. januar 2004 - 15:51 #2
Tjaa C++ og Delphi ligner jo egentlig meget hinanden, så vil da gerne se koden, måske det løser problemet :)
Avatar billede borrisholt Novice
19. januar 2004 - 16:09 #3
Du kan bruge det direkte i C++ Builder. Hvis du ikke ved hvordan så skriv lige igen.

unit UnitDataConnection;

interface

uses
  ADODB, Classes, DB, Sysutils;

type
  TCustomConnection = class(TADOConnection)
  protected
    procedure SetupConnectionString(Sender: TObject); virtual; abstract;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TDBaseConnection = class(TCustomConnection)
  private
    FPath: string;
    procedure SetPath(const Value: string);
  protected
    procedure SetupConnectionString(Sender: TObject); override;
  public
    constructor Create(AOwner: TComponent); override;
    property Path: string read FPath write SetPath;
    property Connected;
  end;

  TSQLServerConnection = class(TCustomConnection)
  private
    FUserName: string;
    FPassWord: string;
    FServerName: string;
    FDatabaseName: string;
    procedure SetDatabaseName(const Value: string);
    procedure SetPassWord(const Value: string);
    procedure SetServerName(const Value: string);
    procedure SetUserName(const Value: string);
  protected
    procedure SetupConnectionString(Sender: TObject); override;
  public
    constructor Create(AOwner: TComponent); override;
    property UserName: string read FUserName write SetUserName;
    property PassWord: string read FPassWord write SetPassWord;
    property DatabaseName: string read FDatabaseName write SetDatabaseName;
    property ServerName: string read FServerName write SetServerName;
  end;

  TAccessConnection = class(TCustomConnection)
  private
    FPassWord: string;
    FUserName: string;
    FFileName: string;
    procedure SetFileName(const Value: string);
    procedure SetPassWord(const Value: string);
    procedure SetUserName(const Value: string);
  protected
    procedure SetupConnectionString(Sender: TObject); override;
  public
    constructor Create(AOwner: TComponent); override;
    property UserName: string read FUserName write SetUserName;
    property PassWord: string read FPassWord write SetPassWord;
    property FileName: string read FFileName write SetFileName;
  end;

implementation

{ TCustomConnection }

constructor TCustomConnection.Create(AOwner: TComponent);
begin
  inherited;
  LoginPrompt := false;
  BeforeConnect := SetupConnectionString;
end;

{ TDBaseConnection }

constructor TDBaseConnection.Create(AOwner: TComponent);
begin
  inherited;
  FPath := '';
end;

procedure TDBaseConnection.SetPath(const Value: string);
begin
  FPath := Value;
end;

procedure TDBaseConnection.SetupConnectionString(Sender: TObject);
begin
  ConnectionString := format('Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files;Mode=ReadWrite;Initial Catalog=%s', [FPath]);
end;

{ TSQLServerConnection }

constructor TSQLServerConnection.Create(AOwner: TComponent);
begin
  inherited;
  FServerName := 'localhost';
  FPassWord := 'masterkey';
  FUserName := 'sysdba';
  FDatabaseName := '';
  ConnectionString := 'Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s';
end;

procedure TSQLServerConnection.SetDatabaseName(const Value: string);
begin
  FDatabaseName := Value;
end;

procedure TSQLServerConnection.SetPassWord(const Value: string);
begin
  FPassWord := Value;
end;

procedure TSQLServerConnection.SetServerName(const Value: string);
begin
  FServerName := Value;
end;

procedure TSQLServerConnection.SetupConnectionString;
var
  s: string;
begin
  s := format(ConnectionString, [FPassword, FUserName, FDatabaseName, FServerName]);
  ConnectionString := s;
end;

procedure TSQLServerConnection.SetUserName(const Value: string);
begin
  FUserName := Value;
end;

{ TAccessConnection }

constructor TAccessConnection.Create(AOwner: TComponent);
begin
  inherited;
  FPassWord := '';
  FUserName := 'Admin';
  FFileName := '';
  ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=%s;Data Source=%s;Jet OLEDB:Database Password=%s;';
end;

procedure TAccessConnection.SetFileName(const Value: string);
begin
  FFileName := Value;
end;

procedure TAccessConnection.SetPassWord(const Value: string);
begin
  FPassWord := Value;
end;

procedure TAccessConnection.SetupConnectionString(Sender: TObject);
var
  s: string;
begin
  s := format(ConnectionString, [FUserName, FFileName, FPassword]);
  ConnectionString := s;
end;

procedure TAccessConnection.SetUserName(const Value: string);
begin
  FUserName := Value;
end;


end.


Jens B
Avatar billede hrc Mester
19. januar 2004 - 17:45 #4
Har du husket at starte IBService?
Avatar billede hrc Mester
19. januar 2004 - 17:47 #5
Du har bemærket login og password i ovenstående, ikke? Det kunne også bare være dem du ledte efter.
Avatar billede spiritusanta Nybegynder
19. januar 2004 - 18:26 #6
Har ikke lige afprøvet det endnu.... men hvor er det du siger det skal indsættes i koden?

Ved ikke om jeg har startet IBService, ved ikke engang hvad det er :)
Avatar billede hrc Mester
19. januar 2004 - 18:46 #7
Jeg antager, at du ikke kører en professionel database, men bare den lokale klient.

For at få adgang til en Interbase-fil skal der køre et service-program i baggrunden.

For at starte/kontrollere at den kører: Kontrolpanelet, "Administrative opgaver", Services. Heri bør du kunne finde en "Interbase Server" og hvis den ikke er startet, så dobbeltklikker du på den osv.

Nu skulle det være muligt at opnå forbindelse. Det kan du teste vha. IBConsole-programmet hvor du skal angive sysdba og masterkey som login.
Avatar billede hrc Mester
19. januar 2004 - 18:48 #8
Når nu der er hul igennem, så skal du til at oprette databaser og tabeller. Det sker via SQL og er ikke helt let. Håber at du har erfaring med relationelle databaser (der ligger nogle gode tutorials under Interbases' doc-katalog)
Avatar billede spiritusanta Nybegynder
19. januar 2004 - 18:57 #9
Hmm den der interbase under services findes vist ikke.... men har interbase installeret.
Avatar billede borrisholt Novice
19. januar 2004 - 19:27 #10
Hvis du alligevel vil bruge en ACCESS DB, er der ingen grund til at bruge interbase. Jeg har i mit kodelagt optil at du bruger ADO det fungerer fint for mig !!!

Jens B
Avatar billede spiritusanta Nybegynder
19. januar 2004 - 19:29 #11
Men hvor skal det indsættes i koden?
Har faktisk kun lavet designet, ikke noget egentlig programmering af det program endnu
Avatar billede hrc Mester
19. januar 2004 - 19:40 #12
Min fejl. Stirrede mig blind på ordet databaser og tænkte slet ikke på Access ;-)

Borrisholdt's eksempel er rettet mod Access og jeg har heller ikke haft problemer med at tilsluttte dertil vha. ADO - men jeg har ikke brugt det meget...
Avatar billede borrisholt Novice
20. januar 2004 - 10:10 #13
Avatar billede spiritusanta Nybegynder
20. januar 2004 - 11:35 #14
ahh det virker :)
Vidste ikke man skulle bruge ADO komponenter, når man arbejde med Excel, er vandt til paradox databaser.
Avatar billede borrisholt Novice
20. januar 2004 - 12:21 #15
Så må du gerne lukke spørgsmålet :)

Jens B
Avatar billede spiritusanta Nybegynder
20. januar 2004 - 12:24 #16
hehe ja :)
Det der undrede mig var bare hvad den der låste Nwind.ldb laver.
Men tak for hjælpen :)
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