2017-02-28 2 views
0

Je construis une application basée sur l'inventaire qui peut être directement exécutée à partir de n'importe quel pc sans installation et donc j'utilise SQL CE .. Sur Démarrer, je vérifie si la base de données est présente. Sinon, je suis en train de créer une nouvelle base de données:SQL CE Ne pas mettre à jour les valeurs de base de données à partir des formulaires Windows

 try 
     { 
      string conString = "Data Source='ITM.sdf';LCID=1033;Password=ABCDEF; Encrypt = TRUE;"; 
      SqlCeEngine engine = new SqlCeEngine(conString); 
      engine.CreateDatabase(); 
      return true; 

     } 
     catch (Exception e) 
     { 
      //MessageBox.Show("Database Already Present"); 
     } 

La base de données est créée correctement et je peux accéder à la base de données pour créer des tableaux et .. Le problème que je suis face est - j'insérer et mettre à jour les dossiers dans les fenêtres sous forme sur le bouton cliquez avec le code:

  using (SqlCeConnection connection = new SqlCeConnection(DatabaseConnection.connectionstring)) 
     { 
      connection.Open(); 
      String Name = NameTxt.Text.ToString(); 
      String Phone = PhoneTxt.Text.ToString(); 
      double balance = Double.Parse(BalanceTxt.Text.ToString()); 
      String City = CityTxt.Text.ToString(); 
      string sqlquery = "INSERT INTO Customers (Name,Phone,Balance,City)" + "Values(@name,@phone, @bal, @city)"; 
      SqlCeCommand cmd = new SqlCeCommand(sqlquery, connection); 
      cmd.Parameters.AddWithValue("@name", Name); 
      cmd.Parameters.AddWithValue("@phone", Phone); 
      cmd.Parameters.AddWithValue("@bal", balance); 
      cmd.Parameters.AddWithValue("@city", City); 
      int x = cmd.ExecuteNonQuery(); 
      if (x > 0) 
      { 
       MessageBox.Show("Data Inserted"); 
      } 
      else 
      { 
       MessageBox.Show("Error Occured. Cannot Insert the data"); 
      } 
      connection.Close(); 
     } 

et le code Updation est

 using (SqlCeConnection connection = new SqlCeConnection(DatabaseConnection.connectionstring)) 
     { 
      connection.Open(); 
      int idtoedit = select_id_edit; 
      String Name = NameEditTxt.Text.ToString(); 
      String Phone = metroTextBox1.Text.ToString(); 
      String City = CityEditTxt.Text.ToString(); 
      string sqlquery = "Update Customers Set Name = @name, Phone = @phone,City = @city where Id = @id"; 
      SqlCeCommand cmd = new SqlCeCommand(sqlquery, connection); 

      cmd.Parameters.AddWithValue("@name", Name); 
      cmd.Parameters.AddWithValue("@phone", Phone); 
      cmd.Parameters.AddWithValue("@id", idtoedit); 
      cmd.Parameters.AddWithValue("@city", City); 
      int x = cmd.ExecuteNonQuery(); 
      if (x > 0) 
      { 
       MessageBox.Show("Data Updated"); 
      } 
      else 
      { 
       MessageBox.Show("Error Occured. Cannot Insert the data"); 
      } 
      loadIntoGrid(); 
      connection.Close(); 
     } 

Chaque fois que j'exécuter du code pour l'insertion et la mise à jour des dossiers - Les enregistrements sont reflétés dans DataGrid rempli avec l'adaptateur de la table de base de données. Mais une fois que je redémarre l'application, les valeurs n'apparaissent pas dans la base de données. Une fois sur un million, les valeurs sont reflétées dans la base de données. Je ne peux pas comprendre la raison derrière ce problème.

Je reffered à ces articles:

C# - ExecuteNonQuery() isn't working with SQL Server CE

Insert, Update, Delete are not applied on SQL Server CE database file for Windows Mobile

Mais depuis que je suis base de données crée par programmation - Il devient créé directement à bin/debug et je ne peux pas le voir en solution Explorateur dans Visual Studio pour modifier les options de copie

+0

Juste pour clarifier sont à la fois mise à jour et insertion de requête en cours d'exécution ** en même temps ** quand 'si (x> 0)'? –

+0

Non .. Ils fonctionnent séparément –

Répondre

1

Vous avez probablement réécrit votre fichier de base de données avec une copie vierge de votre projet.

Voir this answer. Vous ne devriez pas stocker votre base de données dans un dossier bin, vous devriez plutôt trouver une place dans le profil utilisateur ou public dans AppData ou dans un autre dossier, selon vos besoins.

La chaîne de connexion ressemblerait à ceci:

<connectionStrings> 
    <add name="ITMContext" connectionString="data source=|DataDirectory|\ITM.sdf';LCID=1033;Password=ABCDEF; Encrypt = TRUE;" providerName="System.Data.SqlServerCe.4.0"> 

Vous shuld déployer votre fichier db avec votre code execute personnalisé au starup de l'application à un endroit choisi, voir ce blog ErikEJ: http://erikej.blogspot.cz/2013/11/entity-framework-6-sql-server-compact-4_25.html

private const string dbFileName = "Chinook.sdf"; 

private static void CreateIfNotExists(string fileName) 
{ 
    string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
    // Set the data directory to the users %AppData% folder    
    // So the database file will be placed in: C:\\Users\\<Username>\\AppData\\Roaming\\    
    AppDomain.CurrentDomain.SetData("DataDirectory", path); 

    // Enure that the database file is present 
    if (!System.IO.File.Exists(System.IO.Path.Combine(path, fileName))) 
    { 
     //Get path to our .exe, which also has a copy of the database file 
     var exePath = System.IO.Path.GetDirectoryName(
      new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath); 
     //Copy the file from the .exe location to the %AppData% folder 
     System.IO.File.Copy(
      System.IO.Path.Combine(exePath, fileName), 
      System.IO.Path.Combine(path, fileName)); 
    } 
} 

Vérifiez également this post.

Vous avez plusieurs options pour modifier ce comportement. Si votre fichier sdf est partie du contenu de votre projet, cela affectera la façon dont les données sont persistées. N'oubliez pas que lorsque vous déboguez, toutes les sorties de votre projet (y compris le sdf) si dans le dossier bin/debug.

  • Vous pouvez décider de ne pas inclure le fichier sdf dans votre projet et de gérer l'exécution de l'emplacement du fichier. Si vous utilisez "copier si plus récent", et les modifications de projet que vous apportez à la base de données remplaceront toutes les modifications d'exécution/débogage. Si vous utilisez "Ne pas copier", vous devrez spécifier l'emplacement dans le code (comme deux niveaux au-dessus où votre programme est en cours d'exécution).

  • Si vous avez « Copier toujours », les modifications apportées lors de l'exécution sera toujours écrasé

Le fichier de base de données dans votre projet peut être différent lors du débogage ou non. Vérifiez également this answer. Vous pouvez être en train d'écrire vos enregistrements sur une autre copie du fichier de base de données.

+0

Toujours Ne fonctionne pas .. selon votre suggestion. J'ai vérifié au début de l'application si la base de données est présente dans le dossier appdata. si oui - alors j'ai porté sur l'instruction insert et update. Si ce n'est pas le cas, j'ai d'abord créé la base de données dans le dossier bin, puis je l'ai déplacé dans le dossier appdata. Ma chaîne de connexion pour les instructions update et insert est la suivante: public static string connectionstring = "Source de données = '| DataDirectory | /ITM.sdf'; LCID = 1033; Password = ABCDEF; Encrypt = TRUE;"; Toujours le même problème. Les modifications reflètent sur l'exécution, mais ne reflètent pas après le redémarrage de l'application –

+0

Et lorsque l'application est en cours d'exécution, les données mises à jour/insérées sont là? –

+0

Oui. Alors que l'application est en cours d'exécution. toutes les valeurs sont mises à jour/insérées. Une fois que je redémarre l'application. les valeurs ont disparu –