2016-03-24 6 views
1

Mit Delphi 7 mit ADO-Objekten ist es möglich, den ODBC-Datenbanktreiber aus dem TADOConnection-Objekt zu ermitteln? So erkennen, ob es MS-Access oder SQL Server oder Oracle usw.ODBC-Datenbanktreiber vom TADOConnection-Objekt ermitteln?

enter image description here

ist das Programm eine Verbindung zu einer Datenbank, indem Sie einfach den Namen einer ODBC-Datenquelle verwendet wird, und ich möchte, um zu bestimmen, ob diese Datenbank eine MS-Access-Datenbank oder SQL Server. Ich möchte dies tun, weil MS-Access und SQL Server unterschiedliche SQL-Funktionsnamen verwenden, um eine Ganzzahl in eine Zeichenfolge umzuwandeln.

Die Anwendung erstellt eine SQL-Zeichenfolge, die die VERSION einiger Konfigurationsobjekte abruft. Es funktioniert für SQL Server mit cast(), aber ich mag auch MS-Access unterstützen, die CStr() verwendet:

SELECT NAME + '_' + CAST(VERSION as varchar) as OBJECT_NAME FROM ANALYSIS // SQL Server 
SELECT NAME + '_' + CStr(VERSION) as OBJECT_NAME FROM ANALYSIS // MS-Access 

Ich habe an dem TADOConnection.Provider versuchte, Blick, aber das ist MSDASQL.1 in beiden Fällen.

if (myqry.Connection.Provider = 'MSDASQL.1') then 
    strSQL := strSQL + 'cast(' + myfieldname + ' as varchar)' // always goes here.. 
else 
    strSQL := strSQL + 'CStr(' + myfieldname + ')'; // ..never to here 

Ich habe an allen TADOConnection Eigenschaften gesucht, aber ich fange an, es ist nicht möglich, zu vermuten. Irgendwelche Ideen, wie man das löst?

Antwort

2

ODBC soll die Implementierungsdetails des Servers abstrahieren. Sie können use ODBC specific syntax, die in eine Erklärung der entsprechenden SQL-Flavor für den Server übersetzt werden. Hier können Sie ersetzen:

... { fn CONVERT(VERSION, SQL_VARCHAR) } AS OBJECT_NAME FROM ANALYSIS 

Diese Substitutionen als ODBC Escape Sequences sind bekannt und können in Abfragen ersetzt werden, wo es herstellerspezifische Syntax Unterschiede.