2017-02-28 6 views
0

私はインベントリベースのアプリケーションを構築しています。これは、インストールせずに任意のPCから直接実行できるため、SQL CEを使用しています。私は、新しいデータベースを作成していないかのように:SQL CE 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"); 
     } 

データベースが適切に作成され、私は同様にテーブルを作成するために、データベースにアクセスすることができます..私は直面しています問題がある - 私は、Windowsフォームでレコードを挿入し、更新していますボタン上のコードをクリックしてください:

  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(); 
     } 

と私はレコードを挿入し、更新するためのコードを実行するたびにUpdationコードは

 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(); 
     } 

です - レコードがデータグリッドに反映されていますデータベーステーブルからアダプタで埋められます。しかし、いったんアプリケーションを再起動すると、値はデータベースに表示されません。百万にもなると、値がデータベースに反映されます。私はこの問題の背後にある理由を理解できません。

私はこれらの記事にrefferedています

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

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

しかし、私はプログラム的にデータベースを作成していますので、 - それは、ビン/ debugディレクトリに直接作成なっていると私は、溶液中でそれを見ることができませんコピーオプションを変更するためのVisual Studioのエクスプローラ

+0

'if(x> 0)'と同時に**を実行している**更新と挿入のクエリの両方を明確にするだけですか? –

+0

いいえ..別々に動作しています –

答えて

1

おそらく、データベースファイルをプロジェクトの空白のコピーで書き換えます。

this answerを参照してください。データベースはbinフォルダに格納しないでください。必要に応じて、AppDataまたは別のフォルダのユーザープロファイルまたはパブリックプロファイルに場所を配置する必要があります。

接続文字列は次のようになります。

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

あなたは、選択した場所に、アプリのstarupでカスタムコードの実行を使用してDBファイルを展開し、このErikEJのブログを参照shuld: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)); 
    } 
} 

も確認してくださいthis post

この動作を変更するには、いくつかの選択肢があります。あなたのsdfファイルがプロジェクトの内容の一部である である場合、これはどのようにデータが であるかに影響します。 bin/debugフォルダにある場合は、デバッグ時にプロジェクト (sdfを含む)のすべての出力を覚えておいてください。

  • プロジェクトの一部としてsdfファイルを含めないで、ファイルの場所のランタイムを管理することができます。

  • "新しいものをコピーする"を使用している場合、データベースに対するプロジェクトの変更はすべてのランタイム/デバッグの変更を上書きします。

  • 「コピーしない」を使用している場合は、コード内の場所を指定する必要があります(プログラムが実行されている上の2つのレベル)。あなたは「常にコピー」を持っている場合

  • は、実行時に行われた変更は、常にデバッグするか、しない場合は、プロジェクト内のデータベースファイルが異なる場合があります

を上書きされます。またthis answerをチェックしてください。レコードをデータベースファイルの別のコピーに書き込むことができます。

+0

まだあなたの提案通りに動作していません。 appdataフォルダにデータベースがある場合、アプリケーションの開始を確認しました。はいの場合 - 私は挿入と更新のステートメントを運んだ。そうでない場合 - binフォルダにデータベースを作成してappdataフォルダに移動しました。 updateとinsert文のための私の接続文字列は次の通りです:public static string connectionstring = "Data Source = '| DataDirectory | /ITM.sdf'; LCID = 1033; Password = ABCDEF; Encrypt = TRUE; まだ同じ問題です。変更は実行時に反映されますが、アプリの再起動後には反映されません。 –

+0

アプリが実行されているときに更新/挿入されたデータはありますか? –

+0

はい。アプリの実行中。すべての値が更新/挿入されます。一度私はアプリを再起動します。値がなくなった –

関連する問題