Connexion avec un fichier SDF en ADODB

cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009 - 21 nov. 2009 à 11:53
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009 - 23 nov. 2009 à 20:04
Bonjour,

J'utilise Visual Basic Express 2008 et je souhaite établir une connexion avec le fichier BaseTest.sdf

Le code:
dim cnx As New ADODB.Connection
dim TableRésultat As new ADODB.Recordset

cnx.ConnectionString = "PROVIDER=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=" & CheminNomFichier 'C:\....\BaseTest.sdf
cnx.Open()

TableRésultat =Open("SELECT * FROM Table", cnx)

Après exécution, j'ai l'erreur suivante sur la dernière ligne:
Une ou plusieurs erreurs se sont produites lors du traitement de la commande.

Je n'arrive pas à trouver le problème
Merci

22 réponses

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
21 nov. 2009 à 12:42
Salut
Fichier SDF : SQL Server ?
Quelle version ?
Vérifie ta chaine de connexion sur <ce site>

Méthode correcte :
  Dim maVar As ADODB.Connection
  Set maVar = New ADODB.Connecion

Quel est le .State de cnx après le .Open ?
A vérifier avant de poursuivre

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
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
21 nov. 2009 à 12:45
Bien sûr, la méthode de déclaration d'un RecordSet est du même format (Dim, puis Set/New)

Au fait, la méthode Open d'un RecordSet ne s'utilise pas comme ça.
monRecordSet.Open "ma requete SQL", maConnexion, ...
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
21 nov. 2009 à 13:18
J'ai corrigé un peu le code, mais le résultat est le même

dim cnx As ADODB.Connection
cnx = new adodb.connection

dim TableRésultat As ADODB.Recordset
TableRésultat = new ADODB.Recordset

cnx.ConnectionString = "PROVIDER=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=" & CheminNomFichier 'C:\....\BaseTest.sdf
cnx.Open()
' cnx.state = 1 ici

TableRésultat.Open("SELECT * FROM Table", cnx)

Une ou plusieurs erreurs se sont produites lors du traitement de la commande.
cnx.state = 1 après
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
22 nov. 2009 à 00:05
Oui, en effet, en .Net, il n'y a plus de SET

Et on ne sait toujours pas quelle version de SQL Server ...

Si le State de cnx te renvoie 1 = ConnectionState.Open, c'est que la DB est bien ouverte.

Pour ce qui est de ta connexion :
J'ai fait une connexion sur mon SQL Server 2005.
La machine s'appelle "JACK9"
Mon login de connexion est "Jack"
Mon mot de passe est "monMdP"
Ma base de données s'appelle "DBTest"
La chaine de connexion est donc :
cnx.ConnectionString = "Provider=SQLOLEDB;" & _
                       "Data Source=Jack9;" & _
                       "Initial Catalog=DBTest;" & _
                       "User ID=Jack;" & _
                       "Password=monMdP;"

J'ai ensuite interrogé une de mes tables :
Dim sSQL As String "Select * From maTavble Where monChamp 'Codes-Sources'"
Dim rs As New ADODB.Recordset
rs.Open(sSQL, _
        cnx, _
        ADODB.CursorTypeEnum.adOpenStatic, _
        ADODB.LockTypeEnum.adLockOptimistic)
MsgBox(rs.RecordCount)
Et la MsgBox m'a bien renvoyée le nombre d'enregistrements correct.

Complète les paramètres du Open du RecordSet.
A priori, ça devrait marcher.

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

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
22 nov. 2009 à 00:06
Ton SQL Server est-il sur la même machine (ou distant) ?
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
22 nov. 2009 à 09:28
Merci pour les infos
J'ai réussi à établir la connexion
Le fichier est bien en local
voici le code

dim cnx As New ADODB.Connection
dim TableRésultat As new ADODB.Recordset
dim cmd As New ADODB.Command

cnx.ConnectionString = "PROVIDER=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=" & CheminNomFichier 'C:\....\BaseTest.sdf
cnx.Open()

cmd.ActiveConnection = cnx
cmd.CommandText = "SELECT * FROM [Table]"
TableRésultat = cmd.Execute

Voila, cela fonctionne et ma requête également.

Il y a quand même un problème
tablerésultat.recordcount me renvoie -1
Je n'arrive pas encore à solutionner le problème
Merci
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
22 nov. 2009 à 09:46
La méthode Execute est utilisée pour les "Insert Into" ou les "Delete" car il n'y a pas d'enregistrement à récupérer (juste éventuellement, le nombre d'enregistrements touchés par la commande).
Pour récupérer une liste d'enregistrements, c'est Open, comme expliqué plus haut.

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
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
22 nov. 2009 à 10:03
C'est ce que j'avais fait en premier tablerésultat=open(.....
Je viens de remettre ce code toujours l'erreur
En passant pas l'objet command c'est bon, la requête me donne les résultats (pas pour recordcound,movelast)
C'est cursor type qui n'est pas renseigné, je pense.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
23 nov. 2009 à 11:35
Bonjour,

Les propriétés CursorType et CursorLocation sont à renseigner si l'on veut .RecordCount.

CursorLocation doit être égal à adUseClient (résidant en local).


Calade
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
23 nov. 2009 à 12:54
Bonjour,

Tu utilise une syntaxe vb6 pour une connexion .Net >

Vas dans My Project, à l'onglet référence, puis ajoute l'assembly 'System.Data.SqlServerCe'

Plus bas dans la liste 'Espace de noms importés' coche 'System.Data.SqlServerCe'

Il faut en suite utiliser les classes de l'espace de nom importé :

SqlCeConnexion
SqlCeDataAdapter
SqlCeDataReader
SqlCeCommand

Exemple concrêt :

        Dim cnx As New SqlCeConnection("Ta chaîne de connexion")

        Try
            '
            'Tente l'ouverture de la connexion
            cnx.Open()
            '
            'Crée et instancie un DataTable.
            Dim DT As New DataTable
            'Requête SQL.
            Dim Query As String = "SELECT * FROM matable"
            'Instancie un DataAdapter, en lui passant en paramètres la connexion ouverte et la requête SQL.
            Dim TA As New SqlCeDataAdapter(Query, cnx)
            'Remplis 
            TA.Fill(DT)
            '
            'Par la suite tu peux parcourir les élément de la table comme ceci:
            For Each Row As DataRow In DT.Rows
                'après le ! tu doit spécifier le nom de colone de ta table, ceci est un exemple.
                'TextBox1.Text = Row!nom
                'TextBox2.Text = Row!age
                'TextBox2.Text = Row!ville
            Next
            '
            'Ou plus simple, tu peux remplir un DataGridView en lui spécifiant un DataTable comme source de données :
            '
            'DataGridView1.DataSource = DT
            '
            'Ce qui remplira ton DataGridView en une seule ligne de code.
            '
        Catch ex As Exception
            '
            MessageBox.Show("Echec de connexion au serveur de données", _
                            "Echec de connexion", _
                            MessageBoxButtons.OK, _
                            MessageBoxIcon.Exclamation)
            '
        Finally
            '
            If cnx.State <> ConnectionState.Closed Then
                cnx.Close()
            End If
            '
        End Try


Cette méthode est préférable, car elle te permet de travailler avec les contrôles prévus pour les données en .Net.

Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
23 nov. 2009 à 13:01
Ton SQL Server est-il sur la même machine (ou distant) ?


@Jack > Sql Server CE (Compact Edition) est un serveur de bases de données locale sous forme de compsant redistribuable (que l'ont peut inclure facilement dans un projet de dépploiement). L'espace de noms system.Data.SqlServerCe sous .Net à été conçu dans le but de travailler avec ce serveur.

Très pratique pour concevoir un logiciel monoposte en utilisant un base de données et la syntaxe SQL, l'installation de Sql Server CE ne nécessite aucune intervention de la part de l'utilisateur du soft lors de sont installation contrairement à SqlServeur.

++

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
23 nov. 2009 à 13:10
J'ai ajouter les lignes avant le exécute:
TableRésultat.CursorType = ADODB.CursorTypeEnum.adOpenKeyset '1 'adOpenKeyset
TableRésultat.LockType = ADODB.LockTypeEnum.adLockOptimistic
TableRésultat.CursorLocation = ADODB.CursorLocationEnum.adUseClient

Même choses recordcount donne -1 au lieu de 3 normalement
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
23 nov. 2009 à 13:13
Je viens de voir la réponse de mayzz je vais étudier cela
Merci
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
23 nov. 2009 à 13:28
J'ai essayé le code mayzz
Je suis un peu perdu, je ne sais plus quoi marquer dans la chaine de connexion
Ma base de donnée BaseTest.sdf
aucun id, password,... en fait une base des plus simples
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
23 nov. 2009 à 14:00

J'ai essayé le code mayzz
Je suis un peu perdu, je ne sais plus quoi marquer dans la chaine de connexion
Ma base de donnée BaseTest.sdf
aucun id, password,... en fait une base des plus simples


essaye simplement cela : "Data Source=|DataDirectory|\BaseTest.sdf" en tnt que chaîne de connexion.

DataDirectory correspond au répertoire ou l'application s'exécute, tu dois donc placer ta base dans ce répertoire, si ce n'est pas le cas, présise le chemin du fichier.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
23 nov. 2009 à 14:22
C'est ce que j'ai écrit, j'ai vérifié le fichier existe, j'ai écris le nom du fichier avec et sans le chemin
mais :
Echec de connexion au serveur de données
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
23 nov. 2009 à 14:30
Dans le code, met un point d'arrêt sur Catch et donne moi le message de l'exception.

Ou remplace ce code :

        Catch ex As Exception
            '
            MessageBox.Show("Echec de connexion au serveur de données", _
                            "Echec de connexion", _
                            MessageBoxButtons.OK, _
                            MessageBoxIcon.Exclamation)
            '
        Finally


Par :

Catch ex As Exception
'
MessageBox.Show("Echec de connexion au serveur de données." & Environment.NewLine & _
"Details de l'erreur: " & Ex.Message, _
"Echec de connexion", _
MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
'
Finally

Ré-exécute le code et reposte le message d'erreur.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
23 nov. 2009 à 14:52
C'est bon j'ai trouvé après avoir vu de message d'erreur détaillé
La requête "SELECT * FROM [Table]" , il me manqué les []

Dernière question, maintenant:
Comment faire, un RecordCount, MoveLast ou MoveNext?
Merci
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
23 nov. 2009 à 15:48
Heu.. les crochets ? Ca marche sans... as-tu bien remplacer 'matable' par le nom de ta table ?

En .Net les recordset n'existent plus, et ont été remplacés par l'Objet DataTable. Plus haut dans le code je t'ai montré une partie de son utilisation, cette table est une sorte de collection, qui contient des Colums(Colonnes) et des Rows(lignes). Tu peux parcourir cette table :

DataTable.Rows(N° de ligne).Item(N° ou Nom de colone)

Pour connaitre le nombre de ligne utilise la propriété Count :

DataTable.Rows.Count

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
cs_sangoku40 Messages postés 14 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 novembre 2009
23 nov. 2009 à 19:15
Avec les crochets cela passe, je ne sais pas pourquoi, maintenant tous fonctionne
Merci pour les renseignements
0
Rejoignez-nous