Avatar billede nimmer Nybegynder
02. december 1999 - 15:59 Der er 9 kommentarer og
1 løsning

ODBC med Borland C++ Builder ?

Jeg har en Access database som er sat op under ODBC, Spørgsmålet er hvordan man slipper for at havde BDE installeret på alle maskinerne som skal køre mit Builder program?
Avatar billede dmk Nybegynder
03. december 1999 - 10:35 #1
Du bliver nok nødt til at konkretisere dit spørgsmål en smule.

Bruger du Borlands Visual Components for at tilgå din database? Hvis du gør det, så kan du ikke bare lige skifte til ODBC. Hvis du derimod bruger dbi-funktionerne, skulle det være relativt simpelt at skifte det ud med ODBC. OG så kan du undvære BDE. Ellers ikke.

DMK
Avatar billede nimmer Nybegynder
03. december 1999 - 10:40 #2
Jeg bruger dem der ligger i borland c++ builder under fanebladet "DataAccess" ???
Avatar billede dmk Nybegynder
03. december 1999 - 10:52 #3
Okay, så må du undskylde! Jeg troede du brugte deres API, men du bruger deres Visual Components. Dem kan man nok ikke sådan bare lige bytte ud med ODBC. Hvis du vil benytte ODBC's API, så slipper du ikke for at få snavsede dine fingre til i noget programmering. Til gængæld vil du få en meget højre performance, men det er muligvis ikke vigtigt for dig?

DMK
Avatar billede nimmer Nybegynder
03. december 1999 - 11:23 #4
Skal der laves meget kode hvis jeg ønsker at bruge dbi-funktionerne.
Avatar billede nolle_k Nybegynder
03. december 1999 - 13:15 #5
nimmer >>Gu skal der ej!! Se bare at komme igang !!!! Hvor svært kan det være???
Avatar billede dmk Nybegynder
03. december 1999 - 13:26 #6
Du ønsker IKKE at benytte dbi-funktionerne. Da det jo er det BDE bygger på, har du ikke sparet noget som helst. Så kan du lige så godt fortsætte med at benytte Borland VCL.

Men hvis du ikke har noget imod at kode lidt, så benyt ODBC API'et i stedet. Det er nemmere end dbi, og det er meget mere effektivt. Du kan downloade hele SDK'en til ODBC fra www.microsoft.com. Hvis du er intresseret kan jeg godt skrive et lille eksempel-program, som du så kan bruge som udgangspunkt. Sig lige til hvis du gerne vil have det.

Nolle_k >> Det kan være ret svært at kode dbi hvis man ikke har nogen til at fortælle sig hvordan det foregår, og man ikke i forvejen har erfaring med database programmering. Jeg har kodet dbi i noget tid, og jeg fandt ud af at det er imponerende udokumenteret, og nogle gang ganske uforudsigeligt. Og det er vel hele formålet med dette site at vi hjælper hinanden, right ?

DMK
Avatar billede nolle_k Nybegynder
03. december 1999 - 13:37 #7
OK dmk!! Intern Joke mellem nimmer og undertegnede!!

Avatar billede dmk Nybegynder
03. december 1999 - 14:04 #8
Okay, jeg prøver lige at paste noget kode ind. Det kører fint i min Visual, det eneste krav er at det er en console-application. Du kan naturligvis skifte alle mine printf ud med ListBox1->Add(xx), eller hvad det nu er det hedder i
Borland, så skulle det også køre der.

For at prøve det skal du bare kalde funktionen Odbc_Test.

Spørg endelig hvis der er noget du er i tvivl om. God fornøjelse!


//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class Odbc_Handles
{
  public:
  HENV Environment;
  HDBC Connection;
  HSTMT Statement;
  Odbc_Handles()
  {
    Environment=NULL;
    Connection=NULL;
    Statement=NULL;
  } // END constructor
  ~Odbc_Handles()
  {
    if (Statement) SQLFreeStmt(Statement, SQL_DROP);
    if (Connection) { SQLDisconnect(Connection); SQLFreeConnect(Connection); }
    if (Environment) SQLFreeEnv(Environment);
  } // END destructor
};

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
inline bool ODBC_OK(SQLRETURN s) 
{
  return (s==SQL_SUCCESS || s==SQL_SUCCESS_WITH_INFO);
} // END inline function

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool GetError(void *EnvHandle, void *ConnectionHandle, void *StatementHandle)
{
  SQLCHAR State[100];
  SQLINTEGER NErr;
  SQLSMALLINT Len;
  SQLCHAR Message[300];

  while (SQL_SUCCESS==SQLError(EnvHandle, ConnectionHandle, StatementHandle, 
      State, &NErr, Message, 300, &Len))
  printf("Error: %s\n", Message);
  return false;
}

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool WriteResult(HSTMT StatementHandle)
{
#define BUFFER_SIZE 6000
  long DataLength;
  char Data[BUFFER_SIZE];
  int NumResults=0;
  short NumCols;
  SQLCHAR    ColumnName[200];
  SQLSMALLINT NameLength;
  SQLRETURN Ret;
  Ret=SQLNumResultCols(StatementHandle, &NumCols);
  if (!ODBC_OK(Ret)) return GetError(NULL, NULL, StatementHandle);
  for (Ret=SQLFetch(StatementHandle); ODBC_OK(Ret); Ret=SQLFetch(StatementHandle))
  {
    NumResults++;
    printf("Result Row: %d\n--------------------------\n", NumResults);
    for (int NumCol=1; NumCol<=NumCols; NumCol++)
    {
      Ret=SQLDescribeCol(StatementHandle, NumCol, ColumnName, 200, NULL, NULL, NULL, NULL, NULL);     
      if (!ODBC_OK(Ret)) return GetError(NULL, NULL, StatementHandle);
      Ret=SQLGetData(StatementHandle, (short)NumCol, SQL_C_CHAR, Data, BUFFER_SIZE, &DataLength);
      if (!ODBC_OK(Ret)) return GetError(NULL, NULL, StatementHandle);
      if (DataLength!=SQL_NULL_DATA)
      printf("ColumnName: %s \nData: %s\n", ColumnName, Data);
      else
      printf("ColumnName: %s \nData: NULL\n", ColumnName);
    }// END for each column
    printf("\n");
  } // END for all results
  printf("Data retrieved.\n");
  return true;
} // END print result


//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Odbc_Test(char* DSN, char* Username, char* Password, char* SQL)
{
  Odbc_Handles Handles;
  SQLRETURN Ret;
  Ret=SQLAllocEnv(&Handles.Environment);
  if (!ODBC_OK(Ret)) return GetError(Handles.Environment, NULL, NULL);
  Ret=SQLAllocConnect(Handles.Environment, &Handles.Connection);
  if (!ODBC_OK(Ret)) return GetError(Handles.Environment, NULL, NULL);
  Ret=SQLConnect(Handles.Connection, (SQLCHAR*)DSN, SQL_NTS,
      (SQLCHAR*)Username, SQL_NTS, (SQLCHAR*)Password, SQL_NTS);
  if (!ODBC_OK(Ret)) GetError(NULL, Handles.Connection, NULL);
  Ret=SQLAllocStmt(Handles.Connection, &Handles.Statement);
  if (!ODBC_OK(Ret)) return GetError(NULL, Handles.Connection, NULL);
  Ret=SQLExecDirect(Handles.Statement, (SQLCHAR*)SQL, SQL_NTS);
  if (!ODBC_OK(Ret)) return GetError(NULL, NULL, Handles.Statement);
  return WriteResult(Handles.Statement);
}

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


Avatar billede dmk Nybegynder
13. december 1999 - 10:58 #9
Kunne du bruge det til noget?

DMK
Avatar billede zafir Nybegynder
04. maj 2002 - 10:36 #10
Jeg har selv siddet med problemet. Hvis du har en borland builder 1, kan det ikke lade sig gøre med Acces. Jeg tror du skal helt op i en 3.0 eller noget. Jeg har netop fået en 5.0 og der virker det.
Fremgangs måden er som beskrevet ovenfor.
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

IT-JOB

SOS International

License & Vendor Manager

Capgemini Danmark A/S

Java Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Lead DevSecOps