[VB/SQLServeur] Problème Delete
Résolu
SamC7
-
SamC7 -
SamC7 -
Bonjour,
J'ai un soucis depuis plusieurs jours avec mon programme fait sous VB 2008.
J'ai une listbox multiselection que je remplis avec des éléments d'une table d'une bdd SQL Serveur.
Puis j'ai un bouton supprimer ("button_1") qui supprime les éléments sélectionnés dans la listbox dans la bdd et qui raffraichit la listbox.
Mes soucis se trouvent dans la requête pour supprimer les éléments de la bdd.
Vous pouvez m'aider en me disant ce qu'il ne va pas...
Merci d'avance !
Je vous met mon code :
J'ai un soucis depuis plusieurs jours avec mon programme fait sous VB 2008.
J'ai une listbox multiselection que je remplis avec des éléments d'une table d'une bdd SQL Serveur.
Puis j'ai un bouton supprimer ("button_1") qui supprime les éléments sélectionnés dans la listbox dans la bdd et qui raffraichit la listbox.
Mes soucis se trouvent dans la requête pour supprimer les éléments de la bdd.
Vous pouvez m'aider en me disant ce qu'il ne va pas...
Merci d'avance !
Je vous met mon code :
Imports System
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Dim Maconnexion As New SqlConnection
Dim UnDataSet As New DataSet
Dim UneDataTable As New DataTable
Dim DeuxDataTable As New DataTable
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Maconnexion.ConnectionString = "Data Source=.\SQLEXPRESS ; Integrated Security=SSPI; Initial Catalog=test"
Dim Mycommand As SqlCommand = Maconnexion.CreateCommand()
Mycommand.CommandText = "SELECT nom FROM client"
Maconnexion.Open()
Dim myReader As SqlDataReader = Mycommand.ExecuteReader()
Do While myReader.Read()
ListBox1.Items.Add(myReader.GetString(0))
Loop
myReader.Close()
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim C As Integer = ListBox1.SelectedItems.Count
While C <> 0
Dim cmd As SqlCommand
cmd = Maconnexion.CreateCommand
cmd.CommandText = "DELETE FROM dbo.client WHERE nom = " & ListBox1.SelectedItem.ToString & " ; "
MsgBox(cmd.CommandText)
cmd.ExecuteNonQuery()
C = C - 1
Dim I As Integer = ListBox1.SelectedIndex
'ListBox1.SelectedIndices.Remove(I)
ListBox1.Items.RemoveAt(I)
End While
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Maconnexion.Close()
Me.Close()
End Sub
End Class
A voir également:
- [VB/SQLServeur] Problème Delete
- Hiberfil.sys delete - Guide
- Just delete me - Guide
- Vb - Télécharger - Langages
- Vb audio cable - Télécharger - Audio & Musique
- Vb editor - Télécharger - Langages
10 réponses
Bonjour
cmd.CommandText = "DELETE FROM dbo.client WHERE nom = " & ListBox1.SelectedItem.ToString & " ; "
--> va générer une requête du genre : DELETE FROM dbo.client WHERE nom = toto
--> Alors que la bonne requête est : DELETE FROM dbo.client WHERE nom = "toto"
--> il faut que tu "enquotes" la chaine, soit à la main, soit avec une fonction VB qui doit b ien exister :)
Bon courage
cmd.CommandText = "DELETE FROM dbo.client WHERE nom = " & ListBox1.SelectedItem.ToString & " ; "
--> va générer une requête du genre : DELETE FROM dbo.client WHERE nom = toto
--> Alors que la bonne requête est : DELETE FROM dbo.client WHERE nom = "toto"
--> il faut que tu "enquotes" la chaine, soit à la main, soit avec une fonction VB qui doit b ien exister :)
Bon courage
Non ta varaible est OK ... c'est juste qu'il faut enquoter la chaine dans la requete, pour que SQL Server comprenne que c'est une chaine ...
Donc juste un truc comme
cmd.CommandText = "DELETE FROM dbo.client WHERE nom = """ & ListBox1.SelectedItem.ToString & """ ; "
Donc juste un truc comme
cmd.CommandText = "DELETE FROM dbo.client WHERE nom = """ & ListBox1.SelectedItem.ToString & """ ; "
Alors en faite tu me demande de convertir le TOTO en string, c'est ça ?
Mais mon TOTO (=> & Listbox1.SelectedItem) est, d'après le débogage du logiciel déjà un string...
Il me dit =>
Et ensuite sur la ligne du "cmd.ExecuteNonQuery", il dit "Nom de colonne non valide : 'Toto'." et aussi que le "
Donc je comprends plus du tout
Mais mon TOTO (=> & Listbox1.SelectedItem) est, d'après le débogage du logiciel déjà un string...
Il me dit =>
ListBox1.SelectedItem = "Toto" {String}
Et ensuite sur la ligne du "cmd.ExecuteNonQuery", il dit "Nom de colonne non valide : 'Toto'." et aussi que le "
ExecuteNonQuery () As Integer"
Donc je comprends plus du tout
Déjà merci pour tes réponses, tu m'aides beaucoup rien quand me répondant...merci beaucoup...
Ensuite,
J'ai essayé ton code pour voir si ça marcher...
Résultat ma MsgBox me renvoie
Mais j'ai toujours la même erreur sur mon cmd.ExecuteNonQuery => "Nom de colonne non valide : 'toto'."
Ensuite,
J'ai essayé ton code pour voir si ça marcher...
Résultat ma MsgBox me renvoie
DELETE FROM dbo.client WHERE nom ="toto";Donc ça c'est bon... c'est normal...
Mais j'ai toujours la même erreur sur mon cmd.ExecuteNonQuery => "Nom de colonne non valide : 'toto'."
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je ne connais pas bien l'objet cmd.ExecuteNonQuery(), mais ca me parait tres bizarre ... essaie au cas ou les ' au lieu de " ?
cmd.CommandText = "DELETE FROM dbo.client WHERE nom = "' & ListBox1.SelectedItem.ToString & '" ; "
cmd.CommandText = "DELETE FROM dbo.client WHERE nom = "' & ListBox1.SelectedItem.ToString & '" ; "
Cela ne marche toujours pas... Aurais-tu une autre solution a mettre à la place de mon code ?
Parce que là j'y arrive pas du tout en je suis coincé depuis ce week-end !
Merci d'avance
Parce que là j'y arrive pas du tout en je suis coincé depuis ce week-end !
Merci d'avance
désolé mais je ne vois pas ... la requete SQL est correcte (si tu la copies/colles dans un client SQL, ca doit passer non ?) donc c'est un problème de code, et je ne connais pas .NET ...
Il doit bien y avoir des experts ici ?
Bon courage
Il doit bien y avoir des experts ici ?
Bon courage
Merci d'avoir essayer de m'aider... J'ai demandé de l'aide à quelqu'un de mon entourage et finalement y'a du progrès mais y'a toujours des problèmes...
Maintenant la requête n'efface plus que le dernier enregistrement de ma table...
Je met mon code au cas où cela inspire quelqu'un ^^
Maintenant la requête n'efface plus que le dernier enregistrement de ma table...
Je met mon code au cas où cela inspire quelqu'un ^^
Imports System
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Dim Maconnexion As New SqlConnection()
Dim UnDataSet As New DataSet()
Dim UneDataTable As New DataTable()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Maconnexion.ConnectionString = "Data Source=.\SQLEXPRESS ; Integrated Security=SSPI; Initial Catalog=test"
Dim Mycommand As SqlCommand = Maconnexion.CreateCommand()
Mycommand.CommandText = "SELECT id, nom FROM client"
Maconnexion.Open()
Dim myReader As SqlDataReader = Mycommand.ExecuteReader()
Do While myReader.Read()
ListBox1.ValueMember = myReader.GetInt32(0)
ListBox1.Items.Add(myReader.GetString(1))
Loop
myReader.Close()
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim C As Integer = ListBox1.SelectedItems.Count
MsgBox(C)
While C <> 0
Dim I As Integer = ListBox1.SelectedIndex
Dim cmd As SqlCommand = Maconnexion.CreateCommand()
cmd.Connection = Maconnexion
cmd.CommandText = "DELETE FROM dbo.client WHERE id = " & ListBox1.ValueMember
MsgBox(cmd.CommandText)
cmd.ExecuteNonQuery()
ListBox1.Items.RemoveAt(I)
C = C - 1
End While
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Maconnexion.Close()
Me.Close()
End Sub
End Class
Bonjour,
Je ne pense pas que ce code fasse ce que tu veux ...
Je rajouterais avant le end while un truc du genre ListBox1.SelectedIndex = C pour que la 1ère ligne de la boucle (Dim I as ...)
De plus, tu dois pouvoir simplifier, je ne pense pas que C et I soient utiles, pour moi ils contiennent la meme chose non ?
Je ne t'ecris pas le code parce que je ne connais que très peu VB :)
Je ne pense pas que ce code fasse ce que tu veux ...
While C <> 0
Dim I As Integer = ListBox1.SelectedIndex
Dim cmd As SqlCommand = Maconnexion.CreateCommand()
cmd.Connection = Maconnexion
cmd.CommandText = "DELETE FROM dbo.client WHERE id = " & ListBox1.ValueMember
MsgBox(cmd.CommandText)
cmd.ExecuteNonQuery()
ListBox1.Items.RemoveAt(I)
C = C - 1
End While
Je rajouterais avant le end while un truc du genre ListBox1.SelectedIndex = C pour que la 1ère ligne de la boucle (Dim I as ...)
De plus, tu dois pouvoir simplifier, je ne pense pas que C et I soient utiles, pour moi ils contiennent la meme chose non ?
Je ne t'ecris pas le code parce que je ne connais que très peu VB :)
J'ai finalement trouver je met mon code pour ceux qui cherche :
Imports System
Imports System.Data
Imports System.Data.SqlClient
Public Class suppression
Dim Maconnexion As New SqlConnection()
Dim UnDataSet As New DataSet()
Dim UneDataTable As New DataTable()
Private Sub suppression_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Maconnexion.ConnectionString = "Data Source=.\SQLEXPRESS ; Integrated Security=SSPI; Initial Catalog=test"
Maconnexion.Open()
Dim req1 As String
req1 = "select * from dbo.client"
Dim UnDataAdapter As New SqlDataAdapter(req1, Maconnexion)
UnDataAdapter.Fill(UnDataSet, "client")
UneDataTable = UnDataSet.Tables("client")
ListBox1.DisplayMember = "nom"
ListBox1.ValueMember = "id"
ListBox1.DataSource = UneDataTable
Dim X As Integer
For X = 0 To ListBox1.Items.Count - 1
ListBox1.SetSelected(X, True)
Next X
End Sub
Private Sub btn_Supp_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_Supp.Click
Dim C As Integer = ListBox1.Items.Count
For I As Integer = 0 To C - 1
If ListBox1.GetSelected(I) = True Then
Dim cmd As SqlCommand = Maconnexion.CreateCommand()
cmd.Connection = Maconnexion
cmd.CommandText = "DELETE FROM dbo.client WHERE id = " & ListBox1.SelectedValue
cmd.ExecuteNonQuery()
ListBox1.SelectedIndices.Remove(I)
End If
Next I
UneDataTable.Clear()
ListBox1.DataSource = UneDataTable
Dim req1 As String
req1 = "select * from dbo.client"
Dim UnDataAdapter As New SqlDataAdapter(req1, Maconnexion)
UnDataAdapter.Fill(UnDataSet, "client")
UneDataTable = UnDataSet.Tables("client")
ListBox1.DisplayMember = "nom"
ListBox1.ValueMember = "id"
ListBox1.DataSource = UneDataTable
Dim X As Integer
For X = 0 To ListBox1.Items.Count - 1
ListBox1.SetSelected(X, True)
Next X
End Sub
Private Sub btn_Quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Quitter.Click
Maconnexion.Close()
Me.Close()
End Sub
End Class