Ajouter un enregistrement dans une bbd firebird en vba

Résolu
vience Messages postés 6 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 10 février 2018 - 22 déc. 2011 à 09:37
vience Messages postés 6 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 10 février 2018 - 25 déc. 2011 à 20:41
boujour,

je suis en train de développer un projet en vba et pour les besoins de la cause je suis passer d'une base dans excel a une base de donne firebird. j'arrive a me connecter a ma base de donne en utilisant ADODB.connection et en passant par un provider "IBPorvider" voir

voici mon code:


Option Explicit
'Déclaration des variables globales
Global Liberreur As String
Public cnx As New ADODB.connection
Public Rst As New ADODB.Recordset
Public Cmd As New ADODB.Command
Sub ouvetrure_BD()
'Cette procédure appelle la fonction d'ouverture de la BD et affiche la fenêtre d'acceuil.
If OuvrirBase = True Then
MsgBox "Base ouverte"
Else
MsgBox ("La connexion n'a pas réussi,réessayez")
End If
End Sub
Public Function OuvrirBase() As Boolean

cnx.Provider = "LCPI.IBProvider"

cnx.Open "C:\Devis\DEVIS.FDB", "SYSDBA", "masterkey"
Cmd.ActiveConnection = cnx
OuvrirBase = True
Exit Function
'\gbemich\GESPARC\Application\
Erreur:
Liberreur = "Erreur d'ouverture de la Base"
OuvrirBase = False
End Function
Public Sub FermerBase()
'Cette procédure permet de fermer la BD
On Error Resume Next
cnx.Close
MsgBox "Base fermer"
Set cnx = Nothing
End Sub


a priorie ca se connect bien a la base mais j'arrive pas a ajouter des enregistrement


Sub enreg()
'cnx.Execute ("INSERT INTO [CONTACT] (ID,CIVI,NOM,PREMON) VALUES (3,Monsieur,toto,JuJu);")
cnx.Execute "INSERT INTO [CONTACT] ( [NOM],[PRENOM]) VALUES (toto, JUju)"
End Sub



j'ai un message d'erreur qui me dit:

automatic transaction mode is disabled

j'ai bien trouver ca mais j'y comprend rien...

si quelqu'un peu m'aider je lui en serai très reconnaissant...

6 réponses

vience Messages postés 6 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 10 février 2018
23 déc. 2011 à 21:50
bonjour,
j'ai avancer dans mes recherche et j'ai trouver (comme quoi je cherche pas si mal...)

auto_commit est une particularité de IBProvider et la valeur est a false par defaut
effectivement Commande "BeginTrans" permet d'éviter l'erreur
autre methode reconfigurer le provider:
cNx.Provider = "LCPI.IBProvider;auto_commit=True;ctype=?"


une fois ca regler j'ai eu une autre erreur

Cannot convert command text to ib-charset [NONE]. (-2147217900)

alors je me suis aussi casse la tete et j'ai trouver tout seul :D
en fait if faut definir le charset il y en a plein:
ASCII, BIG_5, CYRL, DOS437, DOS737, DOS775, DOS850, DOS852, DOS857, DOS858, DOS860, DOS861, DOS862, DOS863, DOS864, DOS865, DOS866, DOS869, EUCJ_0208, GBK, GB_2312, ISO8859_1, ISO8859_13, ISO8859_2, ISO8859_3, ISO8859_4, ISO8859_5, ISO8859_6, ISO8859_7, ISO8859_8, ISO8859_9, KOI8R, KOI8U, KSC_5601, NEXT, SJIS_0208, TIS620, UNICODE_FSS, UTF8, WIN1250, WIN1251, WIN1252, WIN1253, WIN1254, WIN1255, WIN1256, WIN1257, WIN1258, ICU-Charsets.

et par defaut sur IBProvider il est a [NONE] autrement dit y en a pas...
je vous laisse choisir le votre je vais pas tout faire...

autrement y avais encore une autre erreur qui est facile a corriger quant on sais:

prepare SQL statement failed.
Dynamic SQL Error
SQL error code = -104
token unknown - line 1, column 13

en fait ca veus dire qu'il y a un pb avec le caractère de la ligne 1 colone 13

Sql = "INSERT INTO [
TRUC] " & _
" (MACHIN) " & _
"VALUES ('vince');"
pour le cas present il y a pas de "["
au final voila le code(si tu vois de truc a ameliorer je suis preneur):
Option Explicit
'Déclaration des variables globales
Global Liberreur As String
Public cNx As New ADODB.connection
Public rSt As New ADODB.Recordset
Public cMd As New ADODB.Command
'Public cn_clone  As New IBPSamples.TADOConnectionClone
Sub ouvetrure_BD() '(Sql As String)
'Cette procédure appelle la fonction d'ouverture de la BD et affiche la fenêtre d'acceuil.
Dim Sql As String
If OuvrirBase = True Then
    Sql = "INSERT INTO TRUC " & _
                "       (MACHIN) " & _
                "VALUES ('vince');"
            Debug.Print Sql

rSt.Open Sql, cNx, adOpenStatic, adLockReadOnly, adCmdText
'rSt.Close
'cNx.Close
Set rSt = Nothing
'Set sql = Nothing
Set cNx = Nothing
Else
MsgBox ("La connexion n'a pas réussi,réessayez")
End If
End Sub
Public Function OuvrirBase() As Boolean
Set cNx = New ADODB.connection
cNx.Provider = "LCPI.IBProvider;auto_commit=True;ctype=WIN1252"
cNx.Open "C:\Devis\DEVIS.FDB", "SYSDBA", "masterkey"
cMd.ActiveConnection = cNx
OuvrirBase = True
Exit Function
'\gbemich\GESPARC\Application\
Erreur:
Liberreur = "Erreur d'ouverture de la Base"
OuvrirBase = False
End Function

vala
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 déc. 2011 à 15:45
Salut

VBA n'est pas du VB6 (catégorie)

Côté syntaxe SQL, il faut respecter les règles.
Tu as pris soin d'encadrer tes noms de table et champ avec des [ et ], mais tu as oublié de mettre les encadrements des valeurs :
Valeur de type :
Texte : encadrement par '
Date : encadrement par #
Numérique : pas d'encadrement

Ce qui donnerait
cnx.Execute "INSERT INTO [CONTACT] " & _
            "       ([NOM],[PRENOM]) " & _
            "VALUES ('toto', 'JUju')"


Sinon, côté connexion, en tapant "vb ADODB Firebird" dans ton moteur de recherche favori, il y a des exemples

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
vience Messages postés 6 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 10 février 2018
22 déc. 2011 à 18:47
merci pour ces conseils et ma syntaxt sql je savais quel etais pas bonne mais mon problème pour le momant vient de se message d'érreur: "automatic transaction mode is disabled "


je ai trouver ca : When I do a simple SQL SELECT, I get an error saying "Automatic transaction is disabled
". Do you have any ideas? sur ca

réponse:

When I do a simple SQL SELECT, I get an error saying "Automatic transaction is disabled". Do you have any ideas?
For work in "auto-commit" mode, you should set "auto_commit true" in connection string or set "SessionAutoCommit true" session's property if connection was created already. You may use other mode. See news about it. You may use ADODB.Connection.BeginTrans or start_transaction (for ADO or C++). For more information read examples.

Mais c'est quoi auto_commit ?
comment on le met a true?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 déc. 2011 à 13:41
AutoCommit : Surement une particularité de Firebird.
Il faudrait regarder dans la doc.
Les transactions sont utilisées pour les manipulations multiples avec possibilité de faire marche arrière. Exemple subjectif :
Commande "BeginTrans"
... Pleins de commandes SQL (en lecture comme en écriture/suppression)
Ensuite :
- Commande "RollbackTrans" pour annuler les modifs liées à ces commandes
- Commande "CommitTrans" pour valider ces commandes

Cette technique est à utiliser quand tu as plusieurs manips à faire consécutivement et que tu te réserve le droit d'annuler, par exemple au cas où tu ne trouve pas une données dans une table, ou bien lorsque tu travailles sur une DB multi-utilisateurs car les commandes ne sont réellement exécutées que sur la commande CommitTrans, en une seule fois, donc très rapidement.

Si le moteur SQL de Firebird demande un paramètre supplémentaire, AutoCommit, à préciser lors de la connexion, il faut je pense utiliser les Properties.
Exemple d'ouverture de connexion avec SQL Server :
With cnnSqlServer
    ' Referme si déjà ouverte
    If .State <> adStateClosed Then .Close
    ' Paramétrage connexion
    .ConnectionTimeout = 25
    .Provider = "sqloledb"
    .Properties("Data Source").Value = ServerName
    .Properties("Initial Catalog").Value = DBName
    ' SQL Server dédié
    .Properties("Locale Identifier").Value = 1033   ' impose Anglais
    .Properties("User ID").Value = sUserID
    .Properties("Password").Value = sPassword
    On Error Resume Next
    ' Connexion
    .Open
    ' Attend connexion terminée
    Do While .State = adStateConnecting
        DoEvents
    Loop
    On Error GoTo 0
    ' Au final, renvoie True si on est bien ouvert
    ConnectSqlServer CBool(.State adStateOpen)
End With
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
24 déc. 2011 à 03:35
Cool
Merci d'avoir partagé
0
vience Messages postés 6 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 10 février 2018
25 déc. 2011 à 20:41
ba de rien c'est normal moi j'aime bien trouver des infos complètes...
0
Rejoignez-nous