2013-10-09 3 views
0

Je souhaite lire une valeur datetime à partir d'une base de données Sqlite et l'affecter au contrôle datepicker. Voici mon code que je suis en train:Affectation de la valeur Datetime de sqlite db à datepicker en C# en utilisant wpf

try 
{ 
    sqlitecon.Open(); 
    string Query = "Select * from Customer_New where Cust_Id='" + val + "' "; 
    SQLiteCommand createCommand = new SQLiteCommand(Query, sqlitecon); 
    // createCommand.ExecuteNonQuery(); 
    SQLiteDataReader dr = createCommand.ExecuteReader(); 
    while(dr.Read()){ 
     date_open.DisplayDate = Convert.ToDateTime(dr.GetString(0)); 
     Date_Joining.DisplayDate = Convert.ToDateTime(dr.GetString(1));  
     txt_Title.Text = dr.GetString(3); 
    }     
    sqlitecon.Close(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

mais il donne erreur specified cast is not valid .jusqu'à maintenant pas de solution entre les deux qui sont donnés ci-dessous travaille

+0

Et sur quelle ligne pourrait-il lancer cette erreur? –

+0

essayez de mettre 'test 'GO DROP TABLE Client GO --' pour val – Jonesopolis

+0

Les premier et deuxième champs de votre table de type date dans Sqlite? – Steve

Répondre

0

L'exception est probablement être jeté par la SQLiteDataReader comme est incapable de convertir une valeur de champ en chaîne (peut-être DBNull). Si vous avez des champs Nullable dans votre table, vérifiez d'abord les valeurs NULL en utilisant la fonction IsDBNull avant d'essayer de lire la valeur. Convert.ToDateTime() déclenche un FormatException en erreur.

+0

Mon foramt de DB est: MM/JJ/AAAA ... ici comment asigner datepicker ce format? –

+0

Utilisez 'DateTime.ParseExact (valeur," MM/jj/aaaa ", System.Globalization.CultureInfo.InvariantCulture)' – bolistene

0

Une bonne pratique lorsque vous essayez de lire des données à partir d'une table de base de données est de récupérer uniquement les colonnes dont le code suivant a réellement besoin. Dans votre exemple, vous récupérez tout de la table. Les colonnes sont renvoyées dans le même ordre dans lequel elles apparaissent dans le datatable. Cela signifie que la première colonne doit être la valeur de votre date_open et la deuxième colonne la valeur de votre data_join. Probablement une meilleure approche est de dire explicitement le nom des colonnes dans votre requête select, utilisez un paramètre pour la clé de recherche Cust_ID et utilisez le GetDateTime du lecteur au lieu de convertir tout en une chaîne et le encore à une date .

Dans cet exemple, je suppose que vous avez trois colonnes dans votre table nommées dateopen, datajoin and title. Vous devriez utiliser vos vrais noms à la place.

try 
{ 
    sqlitecon.Open(); 
    string Query = "Select dateopen, datejoin, title from Customer_New where [email protected]"; 
    SQLiteCommand createCommand = new SQLiteCommand(Query, sqlitecon); 
    createCommand.Parameters.AddWithValue("@id", val); 
    SQLiteDataReader dr = createCommand.ExecuteReader(); 
    while(dr.Read()) 
    { 
     // If there is the possibility of a NULL field then protect the assignement 
     // with a check for DBNull.Value before the assignement 
     if(!dr.IsDBNull(0)) 
      date_open.DisplayDate = dr.GetDateTime(0)); 
     if(!dr.IsDBNull(1)) 
      Date_Joining.DisplayDate = dr.GetDateTime(1));  
     if(!dr.IsDBNull(2)) 
      txt_Title.Text = dr.GetString(2); 
    }     
    sqlitecon.Close(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

il donne une erreur: "chaîne n'a pas été reconnue comme une donnée valide" –

+0

Ainsi, lorsque le lecteur essaie de obtenir le premier (ou deuxième) champ, il trouve une chaîne qui ne peut pas être convertie en un datetime. Quelle est la valeur dans la base de données pour la première (ou deuxième) colonne relative à l'ID demandé? Quel est le paramètre de votre locale? – Steve

+0

J'ai essayé en utilisant if (! Dr.IsDBNull (1)) date_open.DisplayDate = dr.GetDateTime (1)); if (! Dr.IsDBNull (2)) Date_Jointing.DisplayDate = dr.GetDateTime (2)); if (! Dr.IsDBNull (3)) txt_Title.Text = dr.GetString (3); mais il donne la même erreur .... Mes tables db sont Cust_id | date_open | Date_Joining | ..... –

Questions connexes