Cookbook ODBC: RequeteODBC.r

File RequeteODBC.r, 3.8 KB (added by cedric, 15 years ago)

Class for querying the database

Line 
1# Nom fichier :        RequeteODBC (classe)
2#' @title RequeteODBC class
3#' @note Inherits from ConnexionODBC
4#' @author Cedric Briand \email{cedric.briand@@lavilaine.com}
5#' @slot baseODBC="vector" (inherited from ConnexionODBC)
6#' @slot silent="logical" (inherited from ConnexionODBC)
7#' @slot etat="character" (inherited from ConnexionODBC)
8#' @slot connexion="ANY" (inherited from ConnexionODBC)
9#' @slot sql="character"
10#' @slot query="data.frame"
11#' @slot open=logical is the connexion left open after the request ?
12#' @example objet=new("RequeteODBC")
13#' @exportClass
14setClass(Class="RequeteODBC",
15                representation= representation(sql="character",query="data.frame",open="logical"),
16                prototype = list(silent=TRUE,open=FALSE),
17                contains="ConnexionODBC")
18
19#' connect method loads a request to the database and returns either an error or a data.frame
20#' @note assign("showmerequest",1,envir=.GlobalEnv) permet d'afficher toutes les requetes passant par la classe connect
21#' @returnType S4 object
22#' @return An object of class RequeteODBC
23#' @author Cedric Briand \email{cedric.briand@@lavilaine.com}
24#' @exportMethod
25#' @example
26#' objet=new("RequeteODBC")
27#' objet@open=TRUE
28#' objet@baseODBC=baseODBC
29#' objet@sql= "select * from t_lot_lot limit 100"
30#' objet<-connect(objet)
31#' odbcClose(objet@connexion)
32#' odbcCloseAll()
33setMethod("connect",signature=signature("RequeteODBC"),definition=function(objet) {     
34                         # la connexion peut deja etre ouverte, on veut eviter de passer par la !
35                        if (is.null(objet@connexion)){ 
36                                        if (length(objet@baseODBC)!=3)  {
37                                                if (exists("baseODBC",envir=.GlobalEnv)) {
38                                                        objet@baseODBC<-get("baseODBC",envir=.GlobalEnv) 
39                                                } else {
40                                                        stop("Il faut definir un vecteur baseODBC avec le lien ODBC, l'utilistateur et le mot de passe")
41                                                }
42                                        }
43                                        # ouverture de la connection ODBC
44                                        e=expression(channel <-odbcConnect(objet@baseODBC[1],
45                                                                        uid = objet@baseODBC[2],
46                                                                        pwd = objet@baseODBC[3],
47                                                                        case = "tolower",
48                                                                        believeNRows = FALSE))
49                                        if (!exists("odbcConnect")) stop("La librairie RODBC est necessaire, chargez le package ! \n")
50                                        if (!objet@silent) print(paste("Essai de connexion :",objet@baseODBC[1],"\n"))
51                                        # renvoit du resultat d'un try catch expression dans
52                                        #l'objet Connexion courante, soit un vecteur caractere
53                                        objet@connexion<-tryCatch(eval(e), error=paste("connexion impossible ",objet@baseODBC)) 
54                                        # un objet S3 RODBC
55                                        if (class(objet@connexion)=="RODBC") {
56                                                if (!objet@silent) print("Connexion établie")
57                                                objet@etat="Connexion en cours"# success
58                                        } else {
59                                                objet@etat<-objet@connexion # report de l'erreur
60                                                objet@connexion<-NULL
61                                                stop("connexion ODBC impossible")
62                                        }
63                                        # Envoi de la requete 
64                                } 
65                        if (!objet@silent) print("Essai de la requete \n") # essai de la requete
66                        if (exists("showmerequest",envir=.GlobalEnv)) print(objet@sql)
67                        e=expression(query<-sqlQuery(objet@connexion,objet@sql,errors=TRUE))
68                        if (objet@open) {
69                                # si on veut laisser la connexion ouverte on ne passe pas de clause finally
70                                resultatRequete<-tryCatch(eval(e),error = function(e) e)
71                        } else {
72                                # sinon la connexion est fermée à la fin de la requète
73                                resultatRequete<-tryCatch(eval(e),error = function(e) e,finally=odbcClose(objet@connexion))
74                        }
75                        if ((class(resultatRequete)=="data.frame")[1]|length(resultatRequete)==0) {
76                                # la requete renvoit soit un dataframe soit rien
77                                if (!objet@silent) print("Requete reussie")
78                                if (class(query)!="character") objet@query=killfactor(query)     # au lieu de query 11/08/2009 11:55:20
79                                objet@etat="Requete reussie"
80                        } else {
81                                # sinon elle renvoit un texte d'erreur
82                                if (!objet@silent) print(resultatRequete)
83                                objet@etat=as.character(resultatRequete)
84                        }
85                        return(objet)
86                })