Difference between revisions of "ODBCConn/fr"
Line 120: | Line 120: | ||
=== Connexions ODBC via DSN === | === Connexions ODBC via DSN === | ||
− | + | Un gestionnaire de pilote ODBC fournit une manière alternative pour créer des raccourcis de DSN pour un jeu de paramètres : | |
− | + | * DSN ('''D'''ata'''S'''ource '''N'''ame soit Nom de Source de Données) : uns source de données utilisateur ou système, identifiée par un nom unique. Les DSNs peuvent être configurés en utilisant l'administrateur de sources de données d'OBDC ou manuellement en éditant le fichier <code>odbc.ini</code> (ou le registre) | |
− | * DSN ('''D'''ata'''S'''ource '''N'''ame): | + | * Fichier DSN : un fichier qui contient des paramètres de connexion. Un administrateur de de source de données ODBC vous permet en général de créer un fichier de DSNs depuis une IHM. |
− | * | + | Les paramètres dans un DSN ou un fichier DSN peuvent toujours être combinés avec des paramètres additionnels dans la chaîne de connexion, par exemple pour spécifier un mot de passe. |
− | + | * * * A FINIR * * * | |
− | |||
By setting up a DSN the connection details can be verified to work within the manager dialog, and then the named DSN is all that is needed to use the connection later. The connection details are therefore ''decoupled'' from your application, as only the DSN name is used in your software - the DSN acting as a go-between. | By setting up a DSN the connection details can be verified to work within the manager dialog, and then the named DSN is all that is needed to use the connection later. The connection details are therefore ''decoupled'' from your application, as only the DSN name is used in your software - the DSN acting as a go-between. | ||
Revision as of 06:55, 30 May 2017
│
English (en) │
español (es) │
français (fr) │
L'unité ODBCConn implémente une connexion SQLdb pour ouvrir des sources de données Open Database Connectivity (ODBC).
Vue d'ensemble
ODBC
ODBC (Open Database Connectivity) est une technologie qui permet à chacun de se connecter à une variété de base de données en utilisant une simple API, l'API ODBC.
Il y a des implémentations ODBC pour des plates-formes diverses et il y a des pilotes pour la plupart des SGBDR. La documentation officielle ODBC peut être trouvée dans le site ODBC de MSDN.
TODBCConnection
FreePascal est livré avec des en-têtes ODBC; Ils se trouvent dans les unités odbcsql
et odbcsqldyn
.
TODBCConnection
est un descendant de TSQLConnection
fournissant une enveloppe POO sympa pour ODBC en utilisant le framework SQLdb.
Dans Lazarus, vous pouvez trouver le composant TODBCConnection
dans l'onglet SQLdb.
Vous pouvez aussi utiliser le composant TODBCConnection
dans votre code en ajoutant l'unité ODBCConn
à votre clause uses.
Ce qui a été implémenté :
- Exécution des requêtes et récupération des ensembles résultats.
- la plupart des types de champ, y compris les BLOB.
- Les paramètres de requêtes (types string et integer).
- La préparation des requêtes.
- UpdateIndexDefs (vous pouvez aussi utiliser ApplyUpdates).
Ce qui reste à implémenter :
- Support approprié aux transactions; Actuellement, chaque connexion correspond à une transaction.
- Quelques types de champ :
- SQL_TYPE_UTC* (ceux-ci sont mentionnés dans les doc ODBC, mais en semble pas utilisées dans les implémentions).
- SQL_INTERVAL_* (quel pourrait être le TFieldType correspondant ?)
- SQL_GUID (TGUIDField n'était pas implémenté, jusqu'à récemment).
Pourquoi utiliser ODBC?
Free Pascal est livré avec des composants pour la connexion à plusieurs bases de données, telles que MySQL, PostGreSQL, Firebird, Microsoft SQL Server (depuis 2.6.1), Oracle, etc.
Pour les bases de données manquantes à la liste, comme MS Access et peut-être Microsoft SQL Server, Microsoft SQL Server, EDBC est une solution acceptable et bien établie.
(Il est recommandé aux développeurs VB.net/C# d'utiliser SQLClient plutôt que OLEDB ou ODBC pour une performance optimale, mais ici, Lazarus ODBC fonctionnera de manière adéquate et fiable)
Le composant TODBCConnection a été développé l'origine pour contourner la licence stricte de MySQL pour les applications qui ne sont pas GPL-isées ou qui n'obéissent pas à MySQL AB exception FLOSS.
Installation d'ODBC des des pilotes ODBC
Avant de pouvoir vous connecter à votre base de données en utilisant ODBC, vous avez besoin d'installer :
- un gestionnaire de pilotes ODBC
- un ilote spécifique au SGBD auquel vous voulez vous connecter.
Cette section bous donnera une brève vue d'ensemble des étapes impliquées. Toutefois, veuillez consulter la documentation pertinente pour une référence définitive.
Le gestionnaire de pilotes ODBC
Windows
windows a un gestionnaire de pilotes ODBC intégré, qui permet le réglages des DSNs et d'autres configurations. Il est accessible depuis le Panneau de contrôle, dans les versions récentes avec des sections catégorisées, il a été déplacé dans l'aire Outils d'administration. Vous pouvez aussi cliquer sur le bouton Démarrer et entrer ODBC dans la boîte d'exécution (dans Windows 7, ceci apparaît comme "Rechercher des programmes et des fichiers").
Vous pouvez, bien sûr, créer un raccourci de bureau vers la boîte de dialogue si vous pensez l'utiliser régulièrement.
Unix-s
Deux gestionnaires de pilotes ODBC populaires dans les paltes-formes sont unixODBC et iODBC.
ODBCConn
est connu pour fonctionner avec unixODBC ; La compatibilité iODBC doit encore être testée.
Debian
Pour Debian, vous pouvez installer le paquet unixodbc :1
aptitude install unixodbc
aptitude install unixodbc-bin # if you want some GUI tools
L'unité odbcsqldyn
et par conséquent odbcconn
, vont chercher un fichier appelé libodbc.so
.
Elle n'acceptera pas un fichier nommé libodbc.so.1
ou libodbc.so.1.0.0
.
Le paquet unixodbc de Debian ne crée pas de lien symbolique (symlink) avec le nom /usr/lib/libodbc.so
; donc vous devez soit :
- créer le lien vous-même :
ln -s libodbc.so.1 /usr/lib/libodbc.so
, ou - installer le paquet unixodbc-dev, qui crée le lien symbolique.
Si vous avez installé le paquet unixodbc-bin, vous pouvez exécuter le programme ODBCConfig
pour configurer les pilotes ODBC et les DSNs.
Ubuntu
Pour Ubuntu, suivez l'instruction pour Debian. Note : Le paquet unixodbc-bin pourrait ne pas être disponible depuis le référentiel de paquet par défaut.
Pilotes ODBC
Vous pouvez télécharger les derniers pilotes ODBC avec les liens suivants :
Télécharger le pilote ODBC 32/64-bit pour SQL Server - la dernière version du pilote SQL Server ODBC qui prend en charge Windows, Mac OS X, Linux à la fois les versions 32 et 64-bit. Compatible avec SQL Server 2014\2012\2008 R2\ 2008\2005 (y compris la version Express), SQL Server 2000 (y compris MSDE), SQL Server 7, SQL Server Compact 4.0\3.5\3.1. Fonctionne sur toutes les version de Lazarus.
Télécharger le pilote ODBC 32/64-bit pour Oracle - Dernière version du pilote ODBC Oracle qui prend en charge Windows, Mac OS X, Linux à la fois les versions 32 et 64-bit. Compatible avec les serveurs Oracle : 12c, 11g, 10g, 9i, 8i, 8.0, y compris Oracle Express Edition 11g et 10g. Clients Oracle : 12c, 11g, 10g, 9i, 8i, 8.0. Fonctionne sur toutes les versions de Lazarus.
Télécharger le pilote ODBC 32/64 bit pour MySQL - Dernière version du pilote MySQL qui prend en charge Windows, Mac OS X, Linux en versions 32 et 64-bit. Compatible avec le serveurs MySQL : 6.0, 5.6, 5.5, 5.1, 5.0, 4.1, 4.0, et 3.23. MariaDB 5.x. Fonctionne sur toutes les versions de Lazarus.
Télécharger le pilote ODBC 32/64 bit pour PostgreSQL - Dernière version du pilote ODBC pour PostgreSQL qui prend en charge Windows, Mac OS X, Linux en versions 32 et 64-bit. Compatible avec les versions de serveur PostgreSQL depuis 7.1 jusqu'à 9.4. Fonctionne sur toutes les versions de Lazarus.
Télécharger le pilote ODBC 32/64-bit pour SQLite - Dernière version du pilote ODBC pour SQLite ODBC qui prend en charge Windows, Mac OS X, Linux en versions 32 et 64-bit. Compatible avec les versions de SQLite depuis 3.0 et supérieur. Fonctionne sur toutes les versions de Lazarus.
Télécharger le pilote ODBC 32/64-bit pour Firebird - Dernière version du pilote ODBC pour Firebird qui prend en charge Windows, Mac OS X, Linux en versions 32 et 64-bit. Compatible avec les versions 3, 2.x, 1.x de Firebird. Fonctionne sur toutes les versions de Lazarus.
Télécharger le pilote ODBC 32/64-bit pour Interbase - Dernière version du pilote ODBC pour Interbase qui prend en charge Windows, Mac OS X, Linux en versions 32 et 64-bit. Compatible avec toutes les versions d'Interbase. Fonctionne sur toutes les versions de Lazarus.
Télécharger le pilote ODBC 32/64-bit pour SQL Azure - Dernière version du pilote ODBC pour SQL Azure qui prend en charge Windows, Mac OS X, Linux en versions 32 et 64-bit. Compatible avec toutes les versions de SQL Azure. Fonctionne sur toutes les versions de Lazarus.
Connexion à une source de données ODBC
Les paramètres de connexion à une source de données ODBC sont décrits à l'aide d'une chaîne de connexion.
C'est une chaîne de la forme NAME=VALUE;NAME=VALUE
.
TODBCConnection
fournit une enveloppe (wrapper) autour de cette chaîne de connexion. Certaines de ses propriétés correspondent à des paires nom-valeur dans la chaîne de connexion et des paramètres personnalisés peuvent être spécifiés dans la propriété Params
(qui est une TStrings
).
Avant d'aller plus en détail sur cette enveloppe, vous devez d'abord avoir une compréhension basique de comment une source de données ODBC est identifiée.
Connexions ODBC via DSN
Un gestionnaire de pilote ODBC fournit une manière alternative pour créer des raccourcis de DSN pour un jeu de paramètres :
- DSN (DataSource Name soit Nom de Source de Données) : uns source de données utilisateur ou système, identifiée par un nom unique. Les DSNs peuvent être configurés en utilisant l'administrateur de sources de données d'OBDC ou manuellement en éditant le fichier
odbc.ini
(ou le registre) - Fichier DSN : un fichier qui contient des paramètres de connexion. Un administrateur de de source de données ODBC vous permet en général de créer un fichier de DSNs depuis une IHM.
Les paramètres dans un DSN ou un fichier DSN peuvent toujours être combinés avec des paramètres additionnels dans la chaîne de connexion, par exemple pour spécifier un mot de passe.
* * * A FINIR * * *
By setting up a DSN the connection details can be verified to work within the manager dialog, and then the named DSN is all that is needed to use the connection later. The connection details are therefore decoupled from your application, as only the DSN name is used in your software - the DSN acting as a go-between.
An advantage to using a named DSN is that you may easily switch between databases using the ODBC Manager, without changing your code. This is useful in commercial development to test for bugs using a number of sets of your clients' data.
Sans DSN
You may also connect via ODBC without using a DSN, simply supplying all the details in the Connection String that you would otherwise set up in a DSN (driver,server,database,login details). This more direct method avoids the need to set up a DSN when installing your application on a new machine.
The ODBC specification defines a few parameters that can be used in a connection string:
- Two special parameters,
DSN
andFILEDSN
, allow one to select a set of pre-defined parameters, as described above. - The
DRIVER
specifies which ODBC driver to use. Obviously, this is a very important parameter. - The
UID
andPWD
parameters are used to supply a username and password.
All other parameters are driver dependent. Please refer to the documentation of the specific driver to learn more about available parameters and their names.
Propriétés TODBCConnection
The following table describes the mapping of TODBCConnection
properties to ODBC connection string parameters:
Property | Type | Connection string parameter |
---|---|---|
Driver |
string |
DRIVER
|
DatabaseName |
string |
DSN , not to something like DATABASENAME , which is not part of the ODBC standard
|
FileDSN |
string |
FILEDSN
|
Password |
string |
PWD
|
UserName |
string |
UID
|
HostName |
string |
none; there is no corresponding parameter in the ODBC standard |
Params |
TStrings |
Use this to specify custom parameters. Each item must be of the form NAME=VALUE .
One important parameter that can be used is |
Note that TODBCConnection
will take care of escaping parameter values in the connection string (when required).
The LoginPrompt
boolean property is not implemented yet.
It would require finding the correct window handle, so a driver can show a GUI dialog to specify parameters.
Note that this is not controlled by the connection string, but rather by the last parameter to the ODBC API function SQLDriverConnect
.
Exemples
In this section, examples are given of connecting to certain DBMSs using their specific ODBC drivers.
Connexion à Excel
Probably works on Windows only.
To avoid errors like: Could not start transaction! ODBC error details: LastReturnCode: SQL_ERROR; Record 1: SqlState: HYC00; NativeError: 106; Message: [Microsoft][ODBC Excel Driver]Optional feature not implemented ;
... you'll have to enable autocommit, something like
ODBCConnection1.Params.Add('AUTOCOMMIT=1');
Connexion à MySQL
For a reference of supported parameters by the MyODBC driver, see [1].
Additionally you may check this mysql odbc connection guide. It has a detail explanation of how to connect to MySQL using ODBC.
The driver name differs a bit depending on the platform and MyODBC version; examples are :
{ properties of connection object, i.e. conn: TODBCConnection; }
conn.Driver := 'MySQL'; // (Unix)
conn.Driver := 'MySQL ODBC 3.51 Driver'; // (Windows)
conn.Driver := 'MySQL Connector/ODBC v5'; // (Windows)
// note: driver name doesn't need {} like it does in SQL Connection Strings elsewhere
Other parameters (when not using a DSN) :
conn.UserName := 'myUsername';
conn.Password := 'myPassword';
// conn.Params (TStrings) set using .add method :
conn.Params.Add('server=example.com');
conn.Params.Add('port=3306');
conn.Params.Add('database=myDatabase');
conn.Params.Add('charset=utf8');
Connexion à MS Access
Please see MS Access.
Connexion à Microsoft SQL Server
Use this mssql odbc driver connection examples which include step by step tutorial and connection strings.
See http://www.connectionstrings.com/sql-server#p7 for more details on connection strings.
Microsoft SQL Server ODBC connection string example:
Server=<server name>; // or <server name>\<instance name>
Database=<database name>;
Connexion à Oracle
Use this odbc oracle connection guide to perform easy and painless connection to Oracle.
Oracle ODBC connection string example:
Login Prompt=False;
Data Source=ORCL;
User ID=scott;
Password=tiger
Connexion à PosgreSQL
Use this postgresql odbc connection guide to perform easy and painless connection to PostgreSQL database.
PostgreSQL ODBC connection string example:
Login Prompt=False;
Data Source=localhost;
User ID=postgres;
Password=postgres;
Database=postgres;
Schema=public
Connexion à SQLite
Use this sqlite odbc connection guide to perform easy and painless connection to SQLite database.
SQLite ODBC connection string example:
Login Prompt=False;
Database=c:\test.db3
Connexion à Firebird
Use this firebird odbc connection guide to perform easy and painless connection to Firebird database.
Firebird ODBC connection string example:
Data Source=127.0.0.1;
User ID=sysdba;
Password=masterkey;
Client Library=fbclient.dll;
Database=c:\fbd.fdb
DSN nommé
On Windows, you can use something like this with an existing named DSN:
{ properties of connection object, i.e. conn: TODBCConnection; }
conn.DatabaseName := '<Your_DSN_Name>';
{ Leave all other conn. properties empty }
DSN-less
Without a DSN:
{ properties of connection object, i.e. conn: TODBCConnection; }
conn.Driver := 'SQL Server';
// note: driver name doesn't need {} like it does in SQL Connection Strings elsewhere
{ Leave Hostname and DatabaseName properties empty }
{ set conn.Params (TStrings) : }
conn.Params.Add('Database=<yourdatabasename>');
conn.Params.Add('Server=.\SQLEXPRESS');
conn.Params.Add('Trusted_Connection=Yes'); // or 'Integrated Security=SSPI'
Note: In this example, we connect to the local machine (server=.), on the instance SQLEXPRESS. You can use a hostname instead of ., and you can omit the instance to connect to the default instance. See MS documentation for details.
Using a trusted connection (also known as integrated security or SSPI) means you login using your Windows user credentials. You can omit the Trusted_Connection line, but then you need to specify user ID (Uid=...) and password (Pwd=...).
Exemple DSN
The example code below selects the rows from a MS SQL Server table called 'journal_entries' and displays all the values of column 'journal_entry' in a Memo control called Memo1.
// uses ODBCConn, sqldb;
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
conn : TODBCConnection; // uses ODBCConn
query: TSQLQuery; // uses sqldb
transaction: TSQLTransaction; // uses sqldb
begin
conn := TODBCCOnnection.Create(nil);
query := TSQLQuery.Create(nil);
transaction := TSQLTransaction.Create(nil);
try
try
conn.DatabaseName := 'sqlserverdsn'; {replace this with your DSN, if you use any}
conn.UserName:= 'sa'; //replace with your user name
conn.Password:= 'thepassword'; //replace with your password
// You can override the properties defined in the DSN, e.g.
//conn.Params.Add('Database=some_other_db');
conn.Transaction := transaction;
query.DataBase := conn;
{ To avoid "could not retrieve primary key metadata":
- either use query.UsePrimaryKeyAsKey:=false
or (preferred)
- query.PacketRecords to -1
If you are using SQL Server, you could alternatively enable MARS in your SQL Native Client ODBC driver.
See http://bugs.freepascal.org/view.php?id=13241 }
query.PacketRecords:=-1; //retrieve all data at once
query.SQL.Text := 'select journal_entry from journal_entries';
query.Open;
S := '';
while not query.EOF do
begin
S := S + query.FieldByName('journal_entry').AsString + #13#10;
query.Next;
end;
finally
query.Free;
conn.Free;
transaction.Free;
end;
except
on E: Exception do
ShowMessage(E.message);
end;
Memo1.Text:= S;
end;
In fact it is possible to use conn.Params for all parts of the connection string, if we modify the above - this time showing the SQL Server version in a pop-up message :
conn.Params.Add('Driver=SQL Server');
conn.Params.Add('Server=OURBIGSERVER');
conn.Params.Add('Database=TestDataBase');
conn.Params.Add('Integrated Security=SSPI'); // use Windows logon credentials
// no other conn. properties set, apart from conn.Transaction := transaction;
query.DataBase := conn;
query.SQL.Text := 'select @@version';
query.Open;
showmessage(query.Fields[0].AsString); // Fields are numbered starting from 0
Functions are supported - e.g. 'SELECT * FROM MyTestFunc()
' - but there may be issues with Stored Procedures that return recordsets. For example, if 'EXEC MyStoredProcedure
' returns data rows (verified in SQL Server Management Studio or with the SqlCmd DOS command: C:\>sqlcmd -S MyServer -E -d MyDataBase -Q "exec MySP"
) then query.open
will give an error : "Cannot open a non-select statement" (this may be fixed after FPC 2.6)
To call a Stored Procedure or to issue other SQL commands that return no rowsets (CREATE,INSERT,UPDATE,DELETE), use query.ExecSQL
instead of query.Open
Stored Procedure parameters work, e.g. 'EXEC MySP @param1=23
'
The use of Parameters is recommended to avoid SQL injection vulnerabilities. In this case the SQL statement isn't built with values directly, but a named placeholder is used instead - and then the parameter is specified separately. Using this method it isn't possible to inject malicious SQL commands into variable fields in an attempt to tamper with the database; the server then knows specifically what part of the statement is a value and what is command. For example, instead of building a WHERE clause directly with the value 95 ('... WHERE field2>95'
), instead use a named parameter like 'testval' -
query.SQL.Text := 'select * from mytable where field2>:testval';
query.Params.ParamByName('testval').AsString := '95';
query.open;
Débogage d'ODBC & erreurs
Problèmes avec des transactions
In Lazarus 1.2.4 (FPC 2.6.4), ODBC transaction behaviour has changed. This may cause previously working code to stop working.
For a solution, see User_Changes_2.6.4#TODBCConnection_.28odbcconn.29_No_longer_autocommit
Messages d'erreur
Each ODBC API call also returns a succes code; if there is an error, more information can be retrieved using calls to SQLGetDiagRec
. (For the sake of completeness: diagnostic records are also available when an API call returns SQL_SUCCES_WITH_INFO
.)
TODBCConnection
checks the return code of each ODBC call and contructs an EODBCException
.
The message
of this exception consists of:
- a message identifying what the
TODBCConnection
was doing when the error occurred - the return code of the ODBC API call (e.g.
SQL_ERROR
) - a number of diagnostic records (obtained using
SQLGetDiagRec
); each record consists of three fields:- a 5-character error code identifying the error
- a 'native error code'
- a message describing the error
Erreur de fonction séquence
If you get a 'Function sequence error' in the finalization section of the ODBCConn
unit, then you probably did not properly clean up all you queries and connections.
Le Rollback ne fonctionne pas
If you issue
TSQLTransaction.Rollback
commands but your SQL is committed regardless, your ODBC connection probably is in AUTOCOMMIT mode; see the remarks about the AUTOCOMMIT connection parameter on how to correct this.
Tracage
Most ODBC managers have a tracing option in which all ODBC API calls are logged to a trace log. This can be very useful for debugging an ODBC application. The ODBC Data Source Administration GUI of both Windows and unixODBC have a tab where you can configure the tracing option.
Of course the trace log is mainly useful for developers that are familiar with the ODBC API, but it can help to identify the problem. Also, you can attach a trace log if you report a problem to the bug tracker.
Voir aussi
- MS Access Utilisation de ODBC pour accéder aux bses de données Microsoft Access.