Fonction recherche sur db sql express 2012 via application vb express 2010

Signaler
-
 nimoht -
salut à toutes et tous
je suis débutant autant en VB qu en SQL
je développe une application me permettant la connection , la lecture , la modification et éventuellement la recherche sur une DB SQLEXPRESS 2012 .

mon soucis sur la fonction recherche est le message d erreur suivant :
-La propriété SelectCommand n'a pas été initialisée avant l'appel de 'Fill'.

voicis le code de ma fonction :

[b]Imports System.Data.SqlClient
Imports System.IO
Imports System.Text

Dim connection As New SqlConnection(String.Format("Data Source={0};Initial Catalog={1};User Id={2};Password={3}", DirectCast(My.Settings.ip, Object), DirectCast(My.Settings.db, Object), DirectCast(My.Settings.user, Object), DirectCast(My.Settings.pass, Object)))
Dim sCommand As SqlCommand
Dim sAdapter As SqlDataAdapter
Dim sBuilder As SqlCommandBuilder
Dim sDs As DataSet
Dim sTable As DataTable

Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click
Me.DataGridView2.Columns.Clear()
My.Settings.from = ComboBox1.SelectedItem.ToString
My.Settings.where = TextBox2.Text
My.Settings.lyke = TextBox3.Text
My.Settings.Save()
If ComboBox1.SelectedItem.ToString = "" Then
MsgBox("Please , Select An Data Table")
ElseIf ComboBox1.SelectedItem.ToString = (String.Format("{0}", DirectCast(My.Settings.from, Object))) Then
connection.open()
sBuilder = New SqlCommandBuilder(sAdapter)
sAdapter = New SqlDataAdapter(sCommand)
sCommand New SqlCommand(String.Format("SELECT * FROM {0} WHERE {1} '%{2}%'", DirectCast(My.Settings.from, Object), DirectCast(My.Settings.where, Object), DirectCast(My.Settings.lyke, Object)))
sDs = New DataSet()
sAdapter.Fill(sDs, (String.Format("{0}", DirectCast(My.Settings.from, Object))))
sTable = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.from, Object)))
connection.Close()
DataGridView2.DataSource = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.from, Object))).DefaultView
DataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End If
End Sub/b

A savoir que les fonctions connections et lecture ( lecture etant identique à recherche sans le 'where_=_' ) fonctionnent à merveille .

Je vous remercie d avance de votre aide car la je bloque complet

8 réponses


Bonjour,

Je n'ai pas de réponse à ton problème, mais je trouve que tu fais du zèle.

Dim connection As New SqlConnection(String.Format("Data Source={0};Initial Catalog={1};User Id={2};Password={3}", DirectCast(My.Settings.ip, Object), DirectCast(My.Settings.db, Object), DirectCast(My.Settings.user, Object), DirectCast(My.Settings.pass, Object)))


Dans la mesure où tes paramètres My.Settings peuvent être sauvegardés en String, tu n'as absolument pas besoin de "Caster" tes paramètres. Une fois que tu as mis "String" comme le type dans l'onglet Paramètres de MyProject, tu vas obtenir automatiquement une valeur en texte.

Bonjour,

Je crois deviner qu'il y a quelqu'un qui as dit de mettre option strict à On et d'éviter les conversions implicites sous peine de mort. Si l'idée est défendable en soi, il ne faut quand même pas transformer les programmes en usines à gaz. (Pour ceux qui se poseraient la question, j'ai appris le BASIC sur un "mainframe" avec un terminal à imprimante et sans option strict; et je n'en suis pas mort.)
Bonjour , merci de ta réponse rapide 'cmarcotte'
En fait come je le disais au départ , je suis débutant en tout ça , jamais eu de réelle formation en informatique ou quoi que ce soit .
Je me suis lancé la dedans pour mon boulot ( application cliente pour server distant )
Les codes utilisés sont des bouts trouvés ici et la sur le net et adaptés à mon projet de manière à le rendre fonctionnel .
J ai , à la base utilisé le direct cast pour les paramètres de connection ( seul moyenfonctionnel que j ai trouvé jusqu ici bien que conpliqué ^^ ).
A la base j avais créé un paragraphe de connection et select puis source datagrid view pour chaque table , ce qui me donnait un codage immense ( 82 datatables pour un client ).
J ai donc réutilisé le système direct cast pour les noms des tables de manière a réduire mon code à 1 paragraphe ( ca marche ) le problème vient de la requette "select * from_where_=_" ; la requette "select * from" marche a merveille .

Voici mon code select from :

[b] Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
My.Settings.table = ComboBox1.SelectedItem
My.Settings.Save()
connection.Open()
sCommand = New SqlCommand((String.Format("SELECT * FROM {0}", DirectCast(My.Settings.table, Object))), connection)
sAdapter = New SqlDataAdapter(sCommand)
sBuilder = New SqlCommandBuilder(sAdapter)
sDs = New DataSet()
sAdapter.Fill(sDs, (String.Format("{0}", DirectCast(My.Settings.table, Object))))
sTable = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.table, Object)))
connection.Close()
DataGridView1.DataSource = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.table, Object)))
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
DataGridView1.ReadOnly = True
Button3.Enabled = True
Button8.Enabled = True
End Sub/b

si quelqu un trouve la cause de mon défaut ca me rendras un immense service
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
(Quand tu colles du code, merci d'utiliser la coloration syntaxique (3ème icône à droite) = plus facile à lire)
re bonjour , en effet , ce sera bcp plus clair ; désolé .
je remet mon code avec les fonctions vers le server :

Imports System.Data.SqlClient        '''''''''imports divers''''''''
Imports System.IO
Imports System.Text

Public Class Form1
    Dim connection As New SqlConnection(String.Format("Data Source={0};Initial Catalog={1};User Id={2};Password={3}", DirectCast(My.Settings.ip, Object), DirectCast(My.Settings.db, Object), DirectCast(My.Settings.user, Object), DirectCast(My.Settings.pass, Object)))
    Dim sCommand As SqlCommand
    Dim sAdapter As SqlDataAdapter
    Dim sBuilder As SqlCommandBuilder     '''''''déclaration des composants'''''''''
    Dim sDs As DataSet
    Dim sTable As DataTable

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load     '''''''''remplissage des textbox suivant paramètres user''''''''
        ToolStripTextBox1.Text = My.Settings.ip
        ToolStripTextBox2.Text = My.Settings.db
        ToolStripTextBox3.Text = My.Settings.user
        ToolStripTextBox4.Text = My.Settings.pass
        ProgressBar1.Minimum = 0
        ProgressBar1.Maximum = 50
    End Sub

    Private Sub ToolStripButton1_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton1.Click    ''''''''sauvegarde des textbox suivant paramètres user''''''''
        My.Settings.ip = ToolStripTextBox1.Text
        My.Settings.db = ToolStripTextBox2.Text
        My.Settings.user = ToolStripTextBox3.Text
        My.Settings.pass = ToolStripTextBox4.Text
        My.Settings.Save()
    End Sub

    Private Sub ToolStripButton3_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton3.Click     ''''''''affichage d une table choisie par user''''''''''
        Me.DataGridView2.Columns.Clear()
        My.Settings.table = ToolStripComboBox1.SelectedItem
        My.Settings.Save()
        If ToolStripComboBox1.SelectedItem = "" Then
            MsgBox("Please , Select An Data Table")
        ElseIf ToolStripComboBox1.SelectedItem = (String.Format("{0}", DirectCast(My.Settings.table, Object))) Then
            connection.Open()
            sCommand = New SqlCommand(String.Format("SELECT * FROM {0}", DirectCast(My.Settings.table, Object)), connection)
            sAdapter = New SqlDataAdapter(sCommand)
            sBuilder = New SqlCommandBuilder(sAdapter)
            sDs = New DataSet()
            sAdapter.Fill(sDs, (String.Format("{0}", DirectCast(My.Settings.table, Object))))
            sTable = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.table, Object)))
            connection.Close()
            For i As Integer = ProgressBar1.Minimum To ProgressBar1.Maximum
                ProgressBar1.Value = i
                Application.DoEvents()
                Threading.Thread.Sleep(10)
            Next
            DataGridView2.DataSource = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.table, Object)))
            DataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        End If
    End Sub

    Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click        '''''''''update de la table (insert seulement , le reste non fonctionnel ???)'''''''''''
        Try
            For i As Integer = ProgressBar1.Minimum To ProgressBar1.Maximum
                ProgressBar1.Value = i
                Application.DoEvents()
                Threading.Thread.Sleep(10)
            Next
            sAdapter.Update(sDs.Tables(String.Format("{0}", DirectCast(My.Settings.table, Object))))
            DataGridView2.DataSource = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.table, Object)))
            MsgBox(String.Format("Successfull Update" & Chr(13) & "{0}", DirectCast(My.Settings.table, Object)))
        Catch ex As SqlException
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click     ''''''''''vidage manuel du dgv''''''''''
        Try
            DataGridView2.Columns.Clear()
            connection.Close()
        Catch ex As SqlException
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click     '''''''''fonction recherche non fonctionnelle'''''''''
        Me.DataGridView2.Columns.Clear()
        My.Settings.from = ComboBox1.SelectedItem.ToString
        My.Settings.where = TextBox2.Text
        My.Settings.lyke = TextBox3.Text
        My.Settings.Save()
        If ComboBox1.SelectedItem.ToString = "" Then
            MsgBox("Please , Select An Data Table")
        ElseIf ComboBox1.SelectedItem.ToString = (String.Format("{0}", DirectCast(My.Settings.from, Object))) Then
            connection.Open()
            sBuilder = New SqlCommandBuilder(sAdapter)
            sAdapter = New SqlDataAdapter(sCommand)
            sCommand New SqlCommand(String.Format("SELECT * FROM {0} WHERE {1} '%{2}%'", DirectCast(My.Settings.from, Object), DirectCast(My.Settings.where, Object), DirectCast(My.Settings.lyke, Object)))
            sDs = New DataSet()
            sAdapter.Fill(sDs, (String.Format("{0}", DirectCast(My.Settings.from, Object))))
            sTable = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.from, Object)))
            connection.Close()
            DataGridView2.DataSource = sDs.Tables(String.Format("{0}", DirectCast(My.Settings.from, Object))).DefaultView
            DataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        End If
    End Sub

    Private Sub Button8_Click(sender As System.Object, e As System.EventArgs) Handles Button8.Click
        If MessageBox.Show("Do you want to delete this row ?", "Delete", MessageBoxButtons.YesNo) = DialogResult.Yes Then
            DataGridView2.Rows.RemoveAt(DataGridView2.SelectedRows(0).Index)
            sAdapter.Update(sDs.Tables(String.Format("{0}", DirectCast(My.Settings.table, Object))))
        End If
    End Sub
End Class


Voila si quelqu un pouvait m aider pour la recherche , éventuellement pour le update 100% fonctionnel ( ajout , modif , suppression) , voici les messages d erreur en mode débug :

-update=delette row :La génération SQL dynamique de DeleteCommand n'est pas prise en charge pour un SelectCommand qui ne retourne pas des informations de colonne clé.

-update=modif row :La génération SQL dynamique de UpdateCommand n'est pas prise en charge pour un SelectCommand qui ne retourne pas des informations de colonne clé.

-recherche :La propriété SelectCommand n'a pas été initialisée avant l'appel de 'Fill'.

voila , si quelqu un a une idée , sait ce qui cloche dans mon code , a une fonction qui marche , je pourrais enfin finaliser ce chti truc

merci d avance
en fait , pour la recherche , une fonction qui masquerai les lignes non recherchées sur le dgv me suffit même si je ne la connais pas si elle existe
bon , déja , j ai réussi la fonction recherche :
    Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click
        Me.DataGridView2.Columns.Clear()
        My.Settings.from = ComboBox1.SelectedItem.ToString
        My.Settings.where = TextBox2.Text
        My.Settings.lyke = TextBox3.Text
        My.Settings.Save()
        If ComboBox1.SelectedItem.ToString = "" Then
            MsgBox("Please , Select An Data Table")
        ElseIf ComboBox1.SelectedItem.ToString = (String.Format("{0}", My.Settings.from)) Then
            Try
                connection.Open()
                sBuilder = New SqlCommandBuilder(sAdapter)
                sAdapter New SqlDataAdapter((String.Format("SELECT * FROM {0} WHERE {1} '{2}'", My.Settings.from, My.Settings.where, My.Settings.lyke)), (String.Format("Data Source={0};Initial Catalog={1};User Id={2};Password={3}", My.Settings.ip, My.Settings.db, My.Settings.user, My.Settings.pass)))
                sDs = New DataSet()
                sAdapter.Fill(sDs, (String.Format("{0}", My.Settings.from)))
                sTable = sDs.Tables(String.Format("{0}", My.Settings.from))
                connection.Close()
            Catch ex As SqlException
                MsgBox(ex.Message)
            End Try
            DataGridView2.DataSource = sDs.Tables(String.Format("{0}", My.Settings.from)).DefaultView
            DataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        End If
    End Sub


ma fonction simplifiée et en mettant les requettes select et connection directement en paramètres du dataadapter
même si je ne voit pas ce que cela change , ca MARCHE ^^

reste la modif et la suppression de ligne et je serai vraiement content
bonjour tout le monde , ayant cloturé le but de ce post , je remercie ceux qui m ont aidé .