[Résolu][Base] maconnexion.setReadOnly(False)

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
CrazyDams
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 27 août 2018 06:54

[Résolu][Base] maconnexion.setReadOnly(False)

Message par CrazyDams »

Bonjour à toutes et à tous,

Voici ce que je souhaite faire à l'ouverture d'une base intégrée :
1. Vérifier si la source existe, si oui : la mettre à jour, sinon la créer (pour le moment çà va)
2. Faire un checkpoint defrag avant de commencer à travailler sur la base (là... çà va plus...)

Il me dit que ma base est en mode ReadOnly et tout s'arrête. J'ai vérifié et mon fichier de base de donné n'est pas coché "ReadOnly", il semble que cela se produise au moment de la "création/mise à jour" de la source.
Du coup, je me dis que je vais mettre ma connexion en ReadOnly = False et que le tour sera joué... que neni... j'ai un autre message d'erreur

Voici mon code :

Code : Tout sélectionner

option explicit

Sub CreaSource
Dim dbContexte As Object, maSource As Object
Dim maConnexion As Object
Dim nomSource As String, cheminBdd As String
Dim stmt as object

cheminBdd = ThisComponent.location
nomSource = "BaseTest"
dbContexte = CreateUnoService("com.sun.star.sdb.DatabaseContext") 

maSource = dbContexte.getbyname(nomsource)

if not dbContexte.hasByName(nomSource) then
  maSource = dbContexte.getByName(cheminBdd) 
  dbContexte.registerObject(nomSource, maSource)
  MsgBox("La source a été créée avec succès.", 64)
else
  dbContexte.revokeObject(nomSource)
  maSource = dbContexte.getByName(cheminBdd) 
  dbContexte.registerObject(nomSource, maSource)	
  MsgBox("La source existait déjà et a été actualisée." & chr(13) & _
         "Vous pouvez continuer.", 64)
endif

maConnexion = maSource.getconnection("","")
'maConnexion.setReadOnly(False) 'Je rajoute cette ligne (sans l'apostrophe devant) une fois que j'ai eu mon premier message d'erreur, et cela provoque une autre erreur

if IsNull(maConnexion) then
  MsgBox("Connexion impossible", 16)
  Stop
end if

stmt = maConnexion.CreateStatement
stmt.executeQuery( "CHECKPOINT DEFRAG" ) 'C'est ici que çà plante une première fois
maconnexion.dispose
MsgBox ("La défragmentation de : " & chr(13) & nomSource & chr(13) & "est maintenant terminée..."', ,")

End Sub
Du coup comment puis-je faire pour
- soit mettre ReadOnly = False quelque part
- soit par une autre solution réussir à réaliser les points 1 et 2 au démarrage de ma base

Merci d'avance pour votre aide. :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par CrazyDams le 13 sept. 2018 19:10, modifié 1 fois.
Apache OpenOffice 4.1.5
Windows 8.1 64 bits
Avatar de l’utilisateur
DLE
SuppOOrter
SuppOOrter
Messages : 1477
Inscription : 30 déc. 2007 18:56
Localisation : Lille

Re: [Base] maconnexion.setReadOnly(False)

Message par DLE »

Bonjour,

Vous pouvez tester ceci sur votre base, voir les commentaires

Code : Tout sélectionner

 Sub CreaSource
    Dim dbContexte As Object, maSource As Object
    Dim maConnexion As Object
    Dim nomSource As String, cheminBdd As String
    Dim stmt as object
	
	login = ""
	password = ""
	ThisDatabaseDocument.CurrentController.connect(login, password)       ' connexion à la base
    maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection '
    cheminBdd = ThisComponent.location
    nomSource = "BaseGestionConge_Test_DLE"
    dbContexte = CreateUnoService("com.sun.star.sdb.DatabaseContext")

  '  maSource = dbContexte.getbyname(nomsource)   ' plante si la base n'est pas enregistrée

    if not dbContexte.hasByName(nomSource) then
      maSource = dbContexte.getByName(cheminBdd)
      dbContexte.registerObject(nomSource, maSource)
      MsgBox("La source a été créée avec succès.", 64)
    else
      dbContexte.revokeObject(nomSource)
      maSource = dbContexte.getByName(cheminBdd)
      dbContexte.registerObject(nomSource, maSource)   
      MsgBox("La source existait déjà et a été actualisée." & chr(13) & _
             "Vous pouvez continuer.", 64)
    endif

    maConnexion = maSource.getconnection("","")
    'maConnexion.setReadOnly(False) 'Je rajoute cette ligne (sans l'apostrophe devant) une fois que j'ai eu mon premier message d'erreur, et cela provoque une autre erreur

    if IsNull(maConnexion) then
      MsgBox("Connexion impossible", 16)
      Stop
    end if

    stmt = maConnexion.CreateStatement
    stmt.execute( "CHECKPOINT DEFRAG" ) 'execute plutôt que executequery C'est ici que çà plante une première fois
    maconnexion.close                   ' fermer la base
    maconnexion.dispose
    MsgBox ("La défragmentation de : " & chr(13) & nomSource & chr(13) & "est maintenant terminée..."', ,")

    End Sub
A+
MacOS Sonoma 14.4.1 (iMac-Intel) : AOO 4.1.15 , LibreOffice 7.6.5.2, Adoptium-temurinJDK_1.8.0_402 -
Windows 10 64 bits :
AOO 4.1.15, Libreoffice 7.1.8.1 - FireFox, Thunderbird, ORB 1.2.1
CrazyDams
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 27 août 2018 06:54

Re: [Base] maconnexion.setReadOnly(False)

Message par CrazyDams »

Bonsoir DLE,

Merci pour ton intervention, j'ai fait les quelques modifs que tu proposes et cela fonctionne, par contre j'ai retiré les close et dispose à la fin du code car je ne pensais pas que cela fermait la base vu que mon code plantait avant d'y arriver, or j'ai besoin de travailler dessus.

Même si mon problème est résolu, j'aurais tout de même été curieux de savoir comment on pouvait passer le setReadOnly a False lorsqu'on est connecté. Cette histoire de "sharing connections" me turlupine :lol:
Apache OpenOffice 4.1.5
Windows 8.1 64 bits