Le titre est assez explicite ;)
Ceux qui ont galéré comme moi pour executer des requêtes ou un champ en DATETIME ou TIMESTAMP apprècieront cette source car il n'y a pas beaucoup d'infos à ce sujet : voir "Allow Zero Datetime=true;" dans "Connect".
Les fonctions que j'ai ajouté permettent de naviguer dans son résultat de requêtes un peu comme dans le langage PHP (enfin très éloigné quand même).
Ci-dessous : la source,
Ci-dessous-dessous : le Zip avec un exemple d'utilisation, (pour testé vous devez quand même le configurer, cad modifiez dans form1 les propriétés de connexion, et adapté les requètes a votre structure de base de données. TESTEZ LE EN MODE DEBUGAGE, le formulaire n'affiche rien).
Source / Exemple :
'Class pour utiliser les DLL de MySql Connector
'Version utilisé de MySql Connector : 5.0
Option Explicit On
Option Strict On
'il faut avoir importé dans les références : MySql.Data
'Disponible sur : http://dev.mysql.com/downloads/connector/net/5.2.html
Imports MySql.Data.MySqlClient
Public Class MySQL
Private Const VAR_VERSION As String = "1.00"
Private Conn As New MySqlConnection
Private VAR_SERVER As String = "localhost"
Private VAR_USER As String = "root"
Private VAR_PASSWORD As String = ""
Private VAR_DATABASE As String = ""
Private VAR_Current_Row As Integer = 0 'Variable de propriété : GET/SET : N° de ligne en cour lue dans la table
Private VAR_EoT As Boolean = True 'Variable de propriété : GET : Indique si l'on est arrivé en fin de table
Private VAR_SQL As String = "" 'Variable de propriété : GET/SET : Requête SQL en cour
Private VAR_Rows As Integer = 0 'Variable de propriété : GET : Nombre de lignes total
Private VAR_Cols As Integer = 0 'Variable de propriété : GET : Nombre de colonnes total
Private VAR_DataTable As DataTable
'Variable de propriété : GET : Le DataTable en cour = ON PEUT NAVIGUER DIRECTEMENT DEDANS après avoir executer
'la fonction query ou query_auto (Si on ne veut pas passer par les fonctions simplifié que j'ai crée ci-dessous)
Private VAR_Affected_Rows As Integer = 0 'Variable de propriété : GET/SET : Le nombre de lignes affectés par une requête non SELECT
Private VAR_Option_NonQuery_Auto As Boolean = True 'Variable de propriété : GET : Définit une option qui laisse la classe déterminer elle même le type de requête : SELECT ou non
#Region "Liste des propriétés"
Public ReadOnly Property Version() As String
Get
Return VAR_VERSION
End Get
End Property
Public Property Connect_Server() As String
Get
Return VAR_SERVER
End Get
Set(ByVal Server As String)
VAR_SERVER = Server
End Set
End Property
Public Property Connect_User() As String
Get
Return VAR_USER
End Get
Set(ByVal User As String)
VAR_USER = User
End Set
End Property
Public Property Connect_Password() As String
Get
Return VAR_PASSWORD
End Get
Set(ByVal Password As String)
VAR_PASSWORD = Password
End Set
End Property
Public Property Connect_Database() As String
Get
Return VAR_DATABASE
End Get
Set(ByVal Database As String)
VAR_DATABASE = Database
End Set
End Property
Public Property Current_Row() As Integer 'long ?
Get
Return VAR_Current_Row
End Get
Set(ByVal Current_Row As Integer) 'long ?
VAR_Current_Row = Current_Row
End Set
End Property
Public Property SQL() As String
Get
Return VAR_SQL
End Get
Set(ByVal SQL As String)
VAR_SQL = SQL
End Set
End Property
Public Property Option_NonQuery_Auto() As Boolean
Get
Return VAR_Option_NonQuery_Auto
End Get
Set(ByVal Option_NonQuery_Auto As Boolean)
VAR_Option_NonQuery_Auto = Option_NonQuery_Auto
End Set
End Property
Public ReadOnly Property Rows() As Integer 'long ?
Get
Return VAR_Rows
End Get
End Property
Public ReadOnly Property Cols() As Integer
Get
Return VAR_Cols
End Get
End Property
Public ReadOnly Property EoT() As Boolean
Get
Return VAR_EoT
End Get
End Property
Public ReadOnly Property DataTable() As DataTable
Get
Return VAR_DataTable
End Get
End Property
Public ReadOnly Property Affected_Rows() As Integer
Get
Return VAR_Affected_Rows
End Get
End Property
#End Region
Public Sub Connect()
'Connexion à la base de données
Dim STR_CONNECTION As String = "server=" & VAR_SERVER & ";" _
& "user id=" & VAR_USER & ";" _
& "password=" & VAR_PASSWORD & ";" _
& "database=" & VAR_DATABASE & ";" _
& "Allow Zero Datetime=true;"
'"Allow Zero Datetime=true;" POUR NE PAS AVOIR DE PROBLEMES AVEC LES DATETIME ET TIMESTAMP
Conn.ConnectionString = STR_CONNECTION
Conn.Open()
End Sub
Public Sub Close()
'Fermeture de la base de données
Conn.Close()
End Sub
#Region "Query"
Public Function Query() As Boolean
'Execute la requête SQL stocké dans la propriété SQL
'et détermine si elle est de type SELECT ou non (si la
'propriété Option_NonQuery_Auto est égal à True) afin
'd'affecté dans les propriétés de "retour" des valeurs adéquates
Dim SQL As String = VAR_SQL
Return Query_NonQuery_Auto(SQL)
End Function
Public Function Query(ByVal SQL As String) As Boolean
'Execute la requête SQL fournie en argument
'et détermine si elle est de type SELECT ou non (si la
'propriété Option_NonQuery_Auto est égal à True) afin
'd'affecté dans les propriétés de "retour" des valeurs adéquates
Return Query_NonQuery_Auto(SQL)
End Function
Public Function Query(ByVal NonQuery As Boolean) As Boolean
'Execute la requête SQL stocké dans la propriété SQL
'selon le mode NonQuery
Dim RST As Boolean = False
Dim SQL As String = VAR_SQL
Return Query_Execute(SQL, NonQuery)
End Function
Public Function Query(ByVal SQL As String, ByVal NonQuery As Boolean) As Boolean
'Execute la requête SQL stocké dans la propriété SQL
'selon le mode NonQuery
Dim RST As Boolean = False
Return Query_Execute(SQL, NonQuery)
End Function
#End Region
#Region "Query_Auto (Connexion et deconnexion automatique)"
'Fonctions identiques à Query sauf que la connexion et
'la deconnexion à la base se fait automatiquement (pourvu qu'on
'est bien remplit les propriétés de connexion
Public Function Query_Auto() As Boolean
Dim RST As Boolean = False
Dim SQL As String = VAR_SQL
Connect()
RST = Query_NonQuery_Auto(SQL)
Close()
Return RST
End Function
Public Function Query_Auto(ByVal SQL As String) As Boolean
Dim RST As Boolean = False
Connect()
RST = Query_NonQuery_Auto(SQL)
Close()
Return RST
End Function
Public Function Query_Auto(ByVal NonQuery As Boolean) As Boolean
Dim RST As Boolean = False
Dim SQL As String = VAR_SQL
Connect()
RST = Query_Execute(SQL, NonQuery)
Close()
Return RST
End Function
Public Function Query_Auto(ByVal SQL As String, ByVal NonQuery As Boolean) As Boolean
Dim RST As Boolean = False
Connect()
RST = Query_Execute(SQL, NonQuery)
Close()
Return RST
End Function
#End Region
#Region "Traitement de le requête SQL"
Private Function As_SELECT(ByVal SQL As String) As Boolean
'Détermine si la requête est de type SELECT
Dim RST As Boolean = False
If SQL.Substring(0, 6).ToLower.ToString = "select" Then RST = True
Return RST
End Function
Private Function Query_NonQuery_Auto(ByVal SQL As String) As Boolean
'Détermine le mode d'execution de la requete : SELECT ou AUTRE
Dim RST As Boolean = False
If VAR_Option_NonQuery_Auto Then
Dim NonQuery As Boolean = Not As_SELECT(SQL)
RST = Query_Execute(SQL, NonQuery)
Else
RST = Query_Execute(SQL, False)
End If
Return RST
End Function
Private Function Query_Execute(ByVal SQL As String, ByVal NonQuery As Boolean) As Boolean
'Execute la requête
Dim RST As Boolean = False
'Initialise les propriétés
VAR_Current_Row = 0
VAR_EoT = True
VAR_Rows = 0
VAR_Cols = 0
VAR_DataTable = Nothing
VAR_Affected_Rows = 0
Try
If NonQuery Then
'Si la requête n'est pas de type SELECT et donc ne renvoit pas de DataTable
Dim reader As MySqlDataReader
Dim cmd As New MySqlCommand(SQL, Conn)
reader = cmd.ExecuteReader()
'affecte la proprité contenant le nombre d'enregistrement affecté par la requête
VAR_Affected_Rows = reader.RecordsAffected
RST = True
Else
'La requête renvoit un DataTable
Dim RST_DataTable As DataTable = New DataTable
Dim Table As New DataSet
Dim da As New MySqlDataAdapter
da = New MySqlDataAdapter(SQL, Conn)
da.Fill(Table, "RST")
RST_DataTable = Table.Tables("RST")
'Affecte les propriétés
VAR_Current_Row = 0
If RST_DataTable.Rows.Count = 0 Then
VAR_EoT = True
Else
VAR_EoT = False
End If
VAR_Rows = RST_DataTable.Rows.Count
VAR_Cols = RST_DataTable.Columns.Count
VAR_DataTable = RST_DataTable
RST = True
End If
Catch ex As MySqlException
MessageBox.Show("Error connecting to the server: " + ex.Message)
Finally
VAR_SQL = SQL
End Try
Return RST
End Function
#End Region
#Region "Fonctions de navigation de le DataTable"
Private Function Update_Current_Row(ByVal Current_Row As Integer) As Boolean
'Met à jour la propriété Current_Row si possible
Dim RST As Boolean = False
If Current_Row > 0 Then
If Current_Row <= VAR_DataTable.Rows.Count Then
VAR_Current_Row = Current_Row
If VAR_Current_Row = VAR_DataTable.Rows.Count Then
VAR_EoT = True
End If
RST = True
End If
End If
Return RST
End Function
Public Function Record_Previous() As Boolean
'Recule de 1 la propriété Current_Row si possible
Return Update_Current_Row(VAR_Current_Row - 1)
End Function
Public Function Record_Next() As Boolean
'Avance de 1 la propriété Current_Row si possible
Return Update_Current_Row(VAR_Current_Row + 1)
End Function
Public Function Get_Value(ByVal key As Object, Optional ByVal row As Integer = 0) As Object
'Permet de récupéré la valeur de la colonne "key" qui peut
'soit être de type String (key) soit de type Numerique (Index)
'en fonction de la propriété Current_Row ou de l'argument
'"row" s'il est remplit
Dim RST As Object
If row = 0 Then
row = VAR_Current_Row
Else
If Not Update_Current_Row(row) Then
'Faudrais qu'une erreur se déclenche, genre : Indice en dehors des limites
End If
End If
If IsNumeric(key) Then
RST = VAR_DataTable.Rows(row).Item(CInt(key))
Else
RST = VAR_DataTable.Rows(row).Item(key.ToString)
End If
Return RST
End Function
#End Region
End Class
Conclusion :
Merci à un ami qui se reconnaitra qui m'a aider à résoudre certaines énigmes tel le problème du DATETIME, et d'autres choses...
PS : j'avait commencé le VB NET, l'année dernière pour tester, mais j'avais dut arrêter pour cause de maintenance d'un logiciel fait en VB6, la j'viens de me remettre sur VBNET et maintenant :
JE LE LACHE PLUS, VB.net c'trop bien !!!!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.