Bonjour,
Est ce que la fonction du dlookup (sous access)a une fonction similaire sous vbnet?
Merci
Version imprimable
Bonjour,
Est ce que la fonction du dlookup (sous access)a une fonction similaire sous vbnet?
Merci
Bonjour
Il existe la méthode ExecuteScalar
A+, Hervé.
Il n'y a pas d'équivalent stricte à Dlookup en VB.NET.
Il n'est pas trop compliqué d'écrire un équivalent à cette fonction à l'aide de la fonction ExecuteScalar et un constructeur de requête.
Après il est probablement plus optimisé de requête un jeu de donnée stockée en interne dans ton programme (dataset, list, etc.) plutôt que de généré une commande SQL pour un récupérer un champ.
Dlookup était déjà connu à l'époque pour ne pas être une fonction rapide et était fortement déconseillée dans les boucles.
chuspyto n'a pas préciser son contexte d'utilisation.
Grenier.self-access
office.microsoft.com/fr-fr/access-helpCitation:
Présentation de DLookup
DLookup (ou RechDom en français) permet de rechercher une valeur unique dans une table : cette valeur est celle d'un champ précis, pour une ligne précise de la table.
Donc la méthode vb.net se rapprochant le plus pour obtenir une information est ExecuteScalar.Citation:
DLookup, fonction
La fonction DLookup permet d'obtenir la valeur d'un champ particulier à partir d'un ensemble d'enregistrements (un domaine) spécifique. Vous pouvez l'utiliser dans un module Visual Basic pour Applications (VBA), une macro, une expression de requête ou un contrôle calculé sur un formulaire ou un état.
Voir lien que j'ai donné au dessus.Citation:
Exécute la requête et retourne la première colonne de la première ligne du jeu de résultats retourné par la requête.Les colonnes ou lignes supplémentaires sont ignorées.
Effectivement ce n'est pas prévue pour des boucles. (une requête avec un jeu d'enregistrement est à faire dans ce cas)
Personnellement je m'en sert lorsque j'ai besoin d'une information ce qui est plus performant que de requêter de nouveau au jeu complet de données.
Ex : en application multiutilisateur lorsque l'utilisateur effectue une modification il est nécessaire de de vérifier au moment de l'enregistrement qu'aucune mise à jour a été faite par quelqu'un d'autre entre le moment ou l'utilisateur a lu les infos et celle ou il veut enregistrer ses infos.
Plutôt que de ramener un jeu complet de l'enregistrement et vérifier chaque données, j'utilise une CIF (Contrainte d'Intégité Fonctionnelle) et je ramène seulement cette donnée. En terme de performance cela est préférable. (dans ce cas de figure ramener une seule info est très utile.
A+, Hervé.
en fait toutes mes tables (15) sont placées sous access ,pour cela que j'aurrai voulu une fonction similaire au dlookup pour faire ma recherche dans mes tables?debutant a peine dans le vb net y aurait il un exemple pour utiliser
executescalar ?
voici ma ligne ,mais pour access
est ce que executescalar est facile d'utilisation?Code:
1
2
3 For i = 1 To boucle res = Nz(DLookup("chm", table1, "[ID] = " & i)) next i
merci
Implémentation d'une fonction avec ExecuteScalar (tout est intégré dans la fonction juste pour l'exemple).
Utilisation de requête paramétrée, cela est fortement conseillé
appel (un Bouton et un TextBox)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Public Function LectureUneInfo(ByVal L_Info As String) As String Dim UneInfo As String = Nothing Using cnn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Projets\BDD\Northwind\nwind.mdb") ' fermer automatiquement en fin using ' requête paramètrée Dim cmd As New OleDbCommand("SELECT CategoryName FROM Categories WHERE CategoryId = ?", cnn) ' Commande requête cmd.Parameters.Add("CategoryId", System.Data.OleDb.OleDbType.VarChar) cmd.Parameters("CategoryId").Value = L_Info cnn.Open() UneInfo = cmd.ExecuteScalar() End Using Return UneInfo End Function
A+, Hervé.Code:
1
2
3 Private Sub btnUneInfo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUneInfo.Click MessageBox.Show(LectureUneInfo(txtId.Text)) End Sub
merci,
petite question comment je peux integrer ce critère sachant que i fait parti d'une boucle
Code:
1
2 for i = 1 to boucle where[n°] =" & i
Avec un paramètre à la fonction, mais cela est une mauvaise idée.
Voici un bon conseil.
Si tu boucles tu vas effectuer x accés à ta base de données.
Avec une requette tu indiques ta plage de recherche (style where[n°] < nombre) et tu parcours le jeu de données résultant.
Tu accéde une seule fois à la BDD, après tu travaille en mémoire.Code:
1
2
3
4
5 Using drr As OleDbDataReader = cmd.ExecuteReader() While drr.Read 'Parcours des enregistrements maliste.add = drr("CategoryId") End While End Using
peux tu me dire si cela conviendrait?
de plus ma liste.add correspond a quoi?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Dim UneInfo As String = Nothing Dim cmd As OleDbCommand = cn.CreateCommand Dim i As Integer Using cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\essai.mdb") ' fermer automatiquement en fin using ' requête paramètréee Dim cmd As New OleDbCommand("SELECT clip FROM test WHERE [n°]<40", cn) ' Commande requête cmd.Parameters.Add("n°", System.Data.OleDb.OleDbType.VarChar) cmd.Parameters("n°").Value = L_Info Using drr As OleDbDataReader = cmd.ExecuteReader() While drr.Read 'Parcours des enregistrements maliste.add = drr("n°") End While End Using cn.Open() UneInfo = cmd.ExecuteScalar() If cn.State = ConnectionState.Open Then MessageBox.Show("connecté a la base") Else MessageBox.Show("non connecté a la base") End If End Using Return UneInfo End Function
Attention tu mélanges tout.
maliste correspond à une variable de type liste pour recevoir toutes les données. Et maliste.add ajoute une donnée dans la liste.
Soit tu cherches un ensemble de données
Soit tu cherches seule une donnée
Soit tu souhaites afficher un jeu de résultat et tu peux procéder autrement.
Tant que l'on ne sait pas ce que tu veux faire, on va partir dans tous les sens.
Des tutos
Utiliser ado.net
ADO.NET : les objet Connection, Command et Datareader
ADO.NET : les objets DataAdapter et Dataset
un cours général et complet regorgeant d'info.
Cours complet sur VB.Net
en fait ce que je voudrais c'est de me connecter a une base access pour pouvoir lire les données de mes tables en clair dans chacune de mes tables access je me retrouve avec une quarantaine d'enregistrement et par le biais de visual studio sur mon form1 j'ai plusieurs boutons et en fonction du bouton que j'appuie je vais rechercher dans ma table l'enregistrement qui lui concerne ex:
bouton 1 enregistrement 1
bouton 2 enregistrement 2
bouton 3 enregistrement 3
bouton 4 enregistrement 4
bouton 5 enregistrement 5
.....
sous access j'avais reussi cela par le biais du dlookup mais ayant des instabilité j'ai voulu utilise visual studio et laissé toutes mes tables de données a access
Donc ça doit ressembler à cela
A adapter bien sur.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Public Sub LectureLigne(ByVal L_Id As String, ByRef sTxtNum As String, ByRef sTxtClip As String) Dim cn As OleDbConnection = New OleDbConnection Dim cmd As OleDbCommand = New OleDbCommand cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\essai.mdb" cmd.Connection = cn ' requête paramètréee cmd.CommandText = "SELECT [n°],clip FROM test WHERE [n°] = ?" cmd.Parameters.Add("n°", System.Data.OleDb.OleDbType.Integer) ' attention au type n° est probablement un entier cmd.Parameters("n°").Value = L_Id cn.Open() Using dr As OleDbDataReader = cmd.ExecuteReader() dr.Read() 'lit l'enregistrement sTxtNum = dr("n°").ToString sTxtClip = dr("clip") End Using cn.Close() End Sub
merci beaucoup