Bonjour,
existe-t-il une gestion des erreurs sous B4A ?
J'écris des données dans une table Sqlite comprenant un index à valeur unique.
Ainsi, si j'ai un doublon, le code génère, en toute logique, une erreur.
Je voudrais donc intercepter cette erreur.
Merci
Une réponse tardive, mais une réponse.
Oui pour gérer les erreurs il faut utiliser
TRY/CATCH/END TRY
Mais attention cette gestion remontera toutes les erreurs.
Donc obligera à réagir pour toute erreur qui surviendrait, et de bien dissocier la réaction, pour chacune si il le faut.
Une discussion sur le sujet :
https://www.b4x.com/android/forum/threads/when-to-use-try-catch-block.56844/
Un exemple de code qui gère un retour en SQL avec la méthode citée.
Il est utilisé une tentative d'écriture dans la base SQL et ça gère les erreurs ou le retour sous diverses formes (update d'enregistrement si il existe un enregistrement correspondant aux critères).
C'est tiré d'une ancienne version de DBUtils (la dernière en date est celle là je pense:
https://www.b4x.com/android/forum/threads/b4x-dbutils-2.81280/ ) mais adapté pour mes besoins dans un programme.
Bien entendu le code appelant gère aussi l'exception retournée si il y a une erreur.
Le fait de démarrer une transaction n'écrit rien dans la base si il n'y a pas lieu, cela peu donc être utilisé pour tester un identifiant unique en adaptant le code et éviter les doublons plutôt que de gérer une erreur en retour.
'Updates a single field in a record
'Field is the column name
' - "No Error" in case of successfull
' - "No record to update" in case of query don't match
' - "Error:", with LastException.Message who follows, in case of error
Sub UpdateRecord(SQL As SQL, TableName As String, Field As String, NewValue As Object, _
WhereFieldEquals As Map) As String
SQL.BeginTransaction
Try
If WhereFieldEquals.Size = 0 Then
Return "Error:WhereFieldEquals map empty!"
End If
'Build the query
Dim sb As StringBuilder
sb.Initialize
sb.Append("SELECT count(*) FROM ").Append(TableName).Append(" WHERE ")
Dim args() As String
For i = 0 To WhereFieldEquals.Size - 1
If i > 0 Then sb.Append(" AND ")
sb.Append("[").Append(WhereFieldEquals.GetKeyAt(i)).Append("] = ?")
args(i) = WhereFieldEquals.GetValueAt(i)
Next
'First search if records exist
Dim NumberOfRecord As Int
NumberOfRecord = SQL.ExecQuerySingleResult2(sb.ToString, args)
If NumberOfRecord=0 Then
Return "No record to update"
Else
sb.Initialize
sb.Append("UPDATE [").Append(TableName).Append("] SET [").Append(Field).Append("] = ? WHERE ")
Dim args2 As List
args2.Initialize
args2.Add(NewValue)
For i = 0 To WhereFieldEquals.Size - 1
If i > 0 Then sb.Append(" AND ")
sb.Append("[").Append(WhereFieldEquals.GetKeyAt(i)).Append("] = ?")
args2.Add(WhereFieldEquals.GetValueAt(i))
Next
SQL.ExecNonQuery2(sb.ToString, args)
SQL.TransactionSuccessful
SQL.EndTransaction
Return "No Error"
End If
Catch
Return "Error:" & LastException.Message
End Try
End Sub