IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

OLEDB Exception type de donnée sur INSERT DB [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Par défaut OLEDB Exception type de donnée sur INSERT DB
    Bonjour,

    Malgré mes recherches sur le forum et mes tutoriaux, je ne trouve pas la réponse à mon problème.
    Je fais un programme qui gère des données stockées en local dans une DB Access. J'utilise un DataSet fortement typé dont les colonnes reprennent la structure de la base (type de données notamment). Ce DataSet alimente un DataGrid. Lorsque je crée une nouvelle entrée, celle-ci s'affiche bien dans le DataGrid mais lorsque j'appelle un dta.Update, j'obtiens une OLEDB Exception "Type de données incompatible dans l'expression du critère." dont voici le stacktrace :
    à System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
    à System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
    à System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
    à System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
    à System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
    à Carnet_de_vol.DataSetCarnetTableAdapters.VolsTableAdapter.Update(VolsDataTable dataTable) dans C:\Users\Christophe\Documents\Visual Studio 2010\Projects\Carnet de vol\Carnet de vol\DataSetCarnet.Designer.vb:ligne 3104
    à Carnet_de_vol.FormMain.Button1_Click(Object sender, EventArgs e) dans C:\Users\Christophe\Documents\Visual Studio 2010\Projects\Carnet de vol\Carnet de vol\FormMain.vb:ligne 213
    à System.Windows.Forms.Control.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ButtonBase.WndProc(Message& m)
    à System.Windows.Forms.Button.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    à Carnet_de_vol.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
    à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ThreadHelper.ThreadStart()


    Je bidouille ma requête SQL INSERT pour tester la colonne qui plante et il s'agit des colonnes contenant des données de type "Decimal". Ca ne plante pas lorsque la donnée créée est un entier. Je suspecte donc un mauvais comportement du DataAdapter qui ne convertit pas les données Decimal en format US (1.32 au lieu de 1,32) ? Je suppose que j'aurais la même chose en UPDATE... Le problème semble connu mais je n'arrive pas à le contourner. Quelqu'un peut-il confirmer et me proposer une solution ?

    Merci d'avance

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Si ce n'est pas le cas, utilise des requètes paramétrées pour la commande SQL INSERT (et aussi pour SELECT, UPDATE et DELETE).

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Par défaut
    J'ai déjà pensé aux requêtes paramétrées mais est-ce possible en conservant le binding automatique avec le DataGridView ? J'ai relu le cours de J.M Rabilloud mais je ne trouve pas la réponse.

    Update :
    Je viens de regarder mon DataAdapter. Ma requête SQL est du type "INSERT INTO Table (DAT, NAT, JD) VALUES (?, ?, ?)" ou DAT est une date (), NAT est un champ texte et JD est un décimal. La requête sans JD fonctionne. Ca bloque sur JD lorsque JD est décimal (un entier ne bloque pas). Dans la collection de paramètres du DataAdapter, je retrouve tous ces champs et les propriétés m'ont l'air d'être correctement renseignées. C'est pourquoi je ne comprends pas l'exception !

    Voici les propriétés du paramètre JD de mon DataAdapter :
    AllowDbNull : True
    ColumnName : JD
    DbType : Decimal
    Direction : Input
    Precision : 7 (comme dans la DB)
    ProviderType : Numeric
    Scale : 2
    Size : 0
    SourceColumn : JD
    SourceColumnNullMapping : False
    SourceVersion : Current


    Dans la DB, les propriétés sont :
    Taille du champ : Decimal
    Format : Standard
    Précision : 7
    Echelle : 2
    Décimales : 2
    Null interdit : Non


    Merci de votre aide...




    -------------------------------------------------------------------------------------------
    On apprend quand on est jeune, on comprend avec l'âge...

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Ma requête SQL est du type "INSERT INTO Table (DAT, NAT, JD) VALUES (?, ?, ?)"
    La présence des "?" indique que c'est bien une requète paramétrée (donc pas de problème de conversion Point<->Virgule).

    Essaie de changer le DbType de Decimal en Double.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Par défaut C'est bon !
    Merci pour ton aide !

    Je dévelloppe pour que ça serve à tout le monde...
    Effectivement, il semble que le type "Decimal" pose problème. J'ai donc modifiée les champs de ce type de la DB en "Double". J'ai également mis à jour
    toutes les propriétés correspondantes de mon DataSet, les colonnes comme les paramètres. Et finalement tout fonctionne ! Je n'imaginais pas que le DataAdapter ne sache pas gérer un type de valeur qu'il propose parmi ses propriétés.

    En résumé, n'utilisez que des champs qui ne portent pas à interprétation : String, Integer, Double...

    Il me reste à adapter le reste du code, tester la requête UPDATE, mais je pense que tout ira bien.

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer de type de données sur une base en production
    Par james_usus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/03/2012, 11h28
  2. Type de données sur 2 bits
    Par Wizard50 dans le forum Langage
    Réponses: 1
    Dernier message: 20/05/2011, 17h53
  3. Probleme type de données sur SQLSERVER
    Par xMs3Do dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/04/2008, 00h50
  4. [SQL 2000] Question sur les types de données
    Par Angath dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/11/2006, 14h05
  5. [Access 2003]Probleme type de donnée sur requete DELETE
    Par pottiez dans le forum Langage SQL
    Réponses: 12
    Dernier message: 09/08/2006, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo