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
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
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);
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -