2013-08-16 2 views
0

Je travaille sur un jeu de cartes qui utilise une base de données pour stocker et récupérer des cartes. Malheureusement, j'ai de la difficulté à récupérer les données de la base de données.SqlCeDataReader Read() return false

Program.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CardGame 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Card c = new Card(); 
      Card d; 

      c.Name = "TestCard"; 
      c.Pack = "Pack"; 
      c.Value = 5; 
      c.Color = Colors.green; 
      c.Description = "Describing stuff"; 

      //Database.CreateCardTable(); (Already created) 
      Database.InsertCard(c); 
      d = Database.RetrieveCard("TestCard"); 

      Console.WriteLine(d.Name); 

      Console.ReadLine(); 
     } 
    } 
} 

Database.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.SqlServerCe; 
using System.Data; 
using System.Data.SqlClient; 

namespace CardGame 
{ 
    class Database 
    { 
     public static void CreateCardTable() 
     { 
      string sqlStr; 
      SqlCeConnection CardConn = new SqlCeConnection(Properties.Settings.Default.CardsConnectionString); 

      sqlStr = "CREATE TABLE Data " + 
       "(Name NVARCHAR(50), " + 
       "Pack NVARCHAR(50), " + 
       "Value INT, " + 
       "Color INT," + 
       "Description NVARCHAR(200))"; 

      SqlCeCommand CardComm = new SqlCeCommand(sqlStr, CardConn); 

      try 
      { 
       CardConn.Open(); 
       CardComm.ExecuteNonQuery(); 
       Console.WriteLine("Tables Created Successfully!"); 
      } 
      catch (System.Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
       Console.WriteLine("Error creating tables."); 
      } 
      finally 
      { 
       if (CardConn.State == ConnectionState.Open) 
       { 
        CardConn.Close(); 
       } 
      } 
     } 

     public static void InsertCard(Card c) 
     { 
      SqlCeConnection CardConn = new SqlCeConnection(Properties.Settings.Default.CardsConnectionString); 

      try 
      { 
       CardConn.Open(); 
       SqlCeCommand insertCommand = new SqlCeCommand("INSERT INTO Data VALUES(@Name, @Pack, @Value, @Color, @Description)", CardConn); 
       insertCommand.Parameters.Add("Name", c.Name); 
       insertCommand.Parameters.Add("Pack", c.Pack); 
       insertCommand.Parameters.Add("Value", c.Value); 
       insertCommand.Parameters.Add("Color", c.Color); 
       insertCommand.Parameters.Add("Description", c.Description); 
       Console.WriteLine("Card inserted successfully"); 
      } 
      catch 
      { 
       Console.WriteLine("Some kind of error."); 
      } 
      finally 
      { 
       if (CardConn.State == ConnectionState.Open) 
       { 
        CardConn.Close(); 
       } 
      } 
     } 

     public static Card RetrieveCard(string name) 
     { 
      Card c = new Card(); 
      SqlCeConnection CardConn = new SqlCeConnection(Properties.Settings.Default.CardsConnectionString); 

      try 
      { 
       CardConn.Open(); 
       SqlCeCommand retrieveCommand = new SqlCeCommand("SELECT * FROM Data WHERE [email protected]", CardConn); 
       retrieveCommand.Parameters.Add("Name", name); 
       SqlCeDataReader reader = retrieveCommand.ExecuteReader(); 

       while (reader.Read()) 
       { 
        Console.WriteLine("Reader: " + reader["Name"].ToString()); 
        c.Name = (string)reader["Name"]; 
        //read rest 
       } 


      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 


      return c; 
     } 

     public void CreateAccountDB(string DBName) 
     { 

     } 
    } 
} 

Quand je lance la carte d'insertion je reçois un message de réussite (à la fin de l'instruction try). Quand je fais Database.RetrieveCard("TestCard"); il atteint la ligne while (reader.Read()) mais mon programme n'atteint pas le code à l'intérieur de l'instruction while. Comment puis-je corriger mon code pour pouvoir lire les cartes de la base de données?

+1

peut-u vérifier que renvoie les données de la requête? –

Répondre

0

J'ai construit la commande pour insérer une carte dans la base de données mais je ne l'ai jamais réellement exécutée. Donc rien n'a jamais été inséré alors quand je vais récupérer la carte, elle ne me rendra rien car il n'y a rien dans la base de données!

j'ai changé

try 
      { 
       CardConn.Open(); 
       SqlCeCommand insertCommand = new SqlCeCommand("INSERT INTO Data VALUES(@Name, @Pack, @Value, @Color, @Description)", CardConn); 
       insertCommand.Parameters.Add("Name", c.Name); 
       insertCommand.Parameters.Add("Pack", c.Pack); 
       insertCommand.Parameters.Add("Value", c.Value); 
       insertCommand.Parameters.Add("Color", c.Color); 
       insertCommand.Parameters.Add("Description", c.Description); 
       Console.WriteLine("Card inserted successfully"); 
      } 

à

try 
      { 
       CardConn.Open(); 
       SqlCeCommand insertCommand = new SqlCeCommand("INSERT INTO Data VALUES(@Name, @Pack, @Value, @Color, @Description)", CardConn); 
       insertCommand.Parameters.Add("Name", c.Name); 
       insertCommand.Parameters.Add("Pack", c.Pack); 
       insertCommand.Parameters.Add("Value", (int)c.Value); 
       insertCommand.Parameters.Add("Color", (int)c.Color); 
       insertCommand.Parameters.Add("Description", c.Description); 
       insertCommand.ExecuteNonQuery(); 
       Console.WriteLine("Card inserted successfully"); 
      }