Problème de paramètre dans une requête "delete" avec PostgreSQL en Odbc (VB.NET)

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 16 oct. 2007 à 17:00
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 18 oct. 2007 à 11:57
Bonjour,
Encore un problème avec ma connections à PostgreSQL (soit je suis vraiment nulle, si si c'est possible, je commence même à le croire, soit PostgreSQL et DotNet ne fonctionne pas complètement ensemble, voire autre chose???)

Pour ceux qui on suivit j'ai déjà hue un problème avec cette connections en OleDb voir ici
Donc du coup je suis en Odbc. Et j'ai encore un problème  (qui n'a rien à voir, enfin je pense)

Je lit ma base et je cherche simplement (pour le moment) à supprimer une/des ligne/s.
Mes paramètres ne semble pas fonctionné (ou alors je les faits mal, je suis débutant en DotNet)
Mon code :

-> La lecture (fonctionne , en même temps pas de quoi être fière) :
        Dim Connection As New Odbc.OdbcConnection("Driver={PostgreSQL ANSI};Server=127.0.0.1;Port=5432;Database=TempTABCRI;Uid=***;Pwd=***;")
        Connection.Open()
        If TestDataSet.Tables.Contains("libelle") Then
            TestDataSet.Tables.Remove("libelle")
        End If
        If TestDataSet.Tables.Contains("transition_texte") Then
            TestDataSet.Tables.Remove("transition_texte")
        End If
        If TestDataSet.Tables.Contains("Phrases") Then
            TestDataSet.Tables.Remove("Phrases")
        End If
        Dim Lecteur As New odbc.odbcDataAdapter()
        Lecteur.SelectCommand = New Odbc.OdbcCommand("SELECT * FROM libelle")
        Lecteur.SelectCommand.Connection = Connection
        TestDataSet.Tables.Add("libelle")
        Lecteur.Fill(TestDataSet.Tables("libelle"))
        TestDataSet.Tables("libelle").Columns("clef").Unique = True
        Dim temp(1) As DataColumn

        temp(0) = TestDataSet.Tables("libelle").Columns("clef")
        TestDataSet.Tables("libelle").PrimaryKey = temp
        Me.DataGridView1.DataSource = TestDataSet.Tables("libelle")
        Connection.Close()

-> Suppressions d'une ligne sur le DataGridView (forcément pas de problème)

-> Update de la base :
        Dim Connection As New Odbc.OdbcConnection("Driver={PostgreSQL ANSI};Server=127.0.0.1;Port=5432;Database=TempTABCRI;Uid=***;Pwd=***;")
        Connection.Open()
        Dim Lecteur As New odbc.odbcDataAdapter()
        Lecteur.DeleteCommand = New Odbc.OdbcCommand("DELETE FROM libelle WHERE clef=@test",Connection)
        Lecteur.DeleteCommand.Parameters.Add("@test", Odbc.OdbcType.Numeric)
        Lecteur.DeleteCommand.Parameters.Item("@test").SourceColumn = "clef"
        Lecteur.DeleteCommand.Parameters.Item("@test").Direction = ParameterDirection.InputOutput
        Lecteur.Update(TestDataSet, "libelle") '******
        Connection.Close()

-> Erreur :
    A l'exécution de la commande update (ligne avec les "*") le compilo me remonte l'erreur suivante :
-----------
ERROR [42703] ERROR: column "test" does not exist;
Error while executing the query
-----------

-> Ce que je comprend :    Mon paramètre n'est pas remplacé par sa valeur et donc PostgreSQL cherche une correspondance de type colonne colonne... Alors que ce que je veux c'est colonne valeur (Cette phrase est elle vraiment claire??? Je ne sais pas comment dire autrement, si ça pose problème j' essayerais d'être plus claire)

Donc bà voila mon problème.
J'aurais voulut évité de faire un truc du style de (mais si il n'y à pas le choix...) :
------
        For Each Item As DataRow In TestDataSet.Tables("libelle").Rows
            If Item.RowState <> DataRowState.Unchanged Then
                'Exécution de ma requête
            End If
        Next
-----

PS :
Sauriez vous comment faire plus proprement ça (si non ça fonctionne donc temps-pi mais je ne trouve pas ça 'propre') :
        Dim temp(1) As DataColumn


        temp(0) = TestDataSet.Tables("libelle").Columns("clef")

        TestDataSet.Tables("libelle").PrimaryKey = temp

PS2 : J'ai beaucoup de travail en ce moment ce qui ne me permet pas d'aider efficacement la communauté (il y à quand même quelque truc que je sait faire). Mais ce n'est que reculé pour mieux sauté. Promis je prendrais le temps dé que l'occasion se présenteras.
Amicalement
Pensez "Réponse acceptée"

3 réponses

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
18 oct. 2007 à 11:57
Bon résultat des course (ou je suis le premier arrivé , logique étant le seul en course )


Je fait de la 'sur-définition' (heeee, je crois que c'est comme ça qu'on dit )


Mes entêtes de fonction :


Private Sub ConfigAdapter(ByRef Adapter As SqlClient.SqlDataAdapter, ByRef Connection As SqlClient.SqlConnection)

Private Sub ConfigAdapter(ByRef Adapter As OleDb.OleDbDataAdapter, ByRef Connection As OleDb.OleDbConnection)

Private Sub ConfigAdapter(ByRef Adapter As Odbc.OdbcDataAdapter, ByRef Connection As Odbc.OdbcConnection)

(Ça m'a pris un temps pour une connerie...).
Quand les testes seront terminé je poste les différentes syntaxes pour les définition de paramètre dans les différant DataAdapter (voir faire un tuto mais pas vraiment le temps ces temps çi ).
Si j'oublie (vraiment très occupé en ce moment, alors perdre tout ce temps là dessus ) posté sur ce topic je recevrais un mail et viendrais voir (pas forcément dans l'heure mais généralement j'essaie de fait vite)

En espérant que ça serve un jours à quelqu'un.

PS :
Sauriez vous comment faire plus proprement ça :
        Dim temp(1) As DataColumn
        temp(0) = TestDataSet.Tables("libelle").Columns("clef")
        TestDataSet.Tables("libelle").PrimaryKey = temp
Amicalement
Pensez "Réponse acceptée"
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
17 oct. 2007 à 16:12
J'ai vue (à vrais dire je ne sais plus où) que les nom de paramètre été remplacé par des "?".
Je viens donc de faire le test (avec un Insert) et ça marche???
Mon code :
        Lecteur.InsertCommand = New Odbc.OdbcCommand("INSERT INTO libelle(clef,texte) VALUES ( ? ,?);", Connection)
        Lecteur.InsertCommand.Parameters.Add("Param1", Odbc.OdbcType.BigInt)
        Lecteur.InsertCommand.Parameters("Param1").SourceColumn = "clef"
        Lecteur.InsertCommand.Parameters.Add("Param2", Odbc.OdbcType.VarChar)
        Lecteur.InsertCommand.Parameters("Param2").SourceColumn = "texte"

Alors bon, c'est bien que ça marche mais comment je sait que le paramètre "toto" remplace le 3ème "?" et pas le suivant???? Il semble que cela dépend de l'index de ce paramètre et c'est tout .

Ça marche mais je trouve ça DÉGUEULASSE (et encore je suis poli) comme façon de faire!

Pourquoi les le paramètres nommé, soit de la forme "@NomParam" dans la requête, ne fonctione pas?
Dû à l'OdbcDataAdapteur, ce qui voudrais dire que SqlDataAdapteur ne fonctionne pas de la même façon (et si c'est la cas ça vas me faire sacrément chier)???
Du au VB.NET (qui serais plus différant que je ne le pensais du C#)

En gros je ne suis pas du tout contant de la façon de fonctionné du OdbcDataAdapteur voir même des DataAdapteur en VB (suivant le ças)
J'avais aréter mais ça vas me reprendre :
    Merci Microbof pour tout ces trucs qui ne fonctionnent qu'à moitié .

Si vous savez d'où cette saleté viens pourriez vous m'informé (ça sera important pour moi plus tard) et avec tout ça je n'ai vraiment pas le temps de faire des tests (sachant qu'en + j'avais commencé à faire un truc que je ne voulais pas voir dans mon code, voir post ci dessus)....

PS (ça aussi si vous savez ça me servirait):
Sauriez vous comment faire plus proprement ça (si non ça fonctionne donc temps-pi mais je ne trouve pas ça 'propre') :
        Dim temp(1) As DataColumn
        temp(0) = TestDataSet.Tables("libelle").Columns("clef")
        TestDataSet.Tables("libelle").PrimaryKey = temp

Merci

Amicalement
Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
17 oct. 2007 à 16:17
Je ne valide pas ma réponse car j'espère que comme ça il y aura plus de chance que quelqu'un réponde à mes interrogations (peut être que je me trompe mais seul sur ce topic).

Amicalement
Pensez "Réponse acceptée"
0
Rejoignez-nous