簡體   English   中英

為什么將更改保存到數據庫失敗?

[英]Why saving changes to a database fails?

我在控制台應用程序中有以下 C# 代碼。

每當我調試應用程序並運行 query1(將新值插入數據庫)然后運行 ​​query2(顯示數據庫中的所有條目)時,我都可以清楚地看到我插入的新條目。 但是,當我關閉應用程序並檢查數據庫中的表(在 Visual Studio 中)時,它消失了。 我不知道為什么它不保存。

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlServerCe;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string fileName = "FlowerShop.sdf";
                string fileLocation = "|DataDirectory|\\";
                DatabaseAccess dbAccess = new DatabaseAccess();
                dbAccess.Connect(fileName, fileLocation);

                Console.WriteLine("Connected to the following database:\n"+fileLocation + fileName+"\n");
                string query = "Insert into Products(Name, UnitPrice, UnitsInStock) values('NewItem', 500, 90)";
                string res = dbAccess.ExecuteQuery(query);
                Console.WriteLine(res);

                string query2 = "Select * from Products";
                string res2 = dbAccess.QueryData(query2);
                Console.WriteLine(res2);
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                Console.ReadLine();
            }
        }
    }

    class DatabaseAccess
    {
        private SqlCeConnection _connection;

        public void Connect(string fileName, string fileLocation)
        {
            Connect(@"Data Source=" + fileLocation + fileName);
        }

        public void Connect(string connectionString)
        {
            _connection = new SqlCeConnection(connectionString);
        }

        public string QueryData(string query)
        {
            _connection.Open();
            using (SqlCeDataAdapter da = new SqlCeDataAdapter(query, _connection))
            using (DataSet ds = new DataSet("Data Set"))
            {
                da.Fill(ds);
                _connection.Close();
                return ds.Tables[0].ToReadableString(); // a extension method I created
            }
        }

        public string ExecuteQuery(string query)
        {
            _connection.Open();
            using (SqlCeCommand c = new SqlCeCommand(query, _connection))
            {
                int r = c.ExecuteNonQuery();
                _connection.Close();
                return r.ToString();
            }
        } 
    }

編輯:忘了提及我使用的是 SQL Server Compact Edition 4 和 VS2012 Express。

這是一個很常見的問題。 您使用|DataDirectory| 替換字符串。 這意味着,在 Visual Studio 環境中調試應用程序時,應用程序使用的數據庫位於項目的子文件夾BIN\\DEBUG文件夾(或 x86 變體)中。 這很有效,因為您沒有任何類型的連接到數據庫和進行更新操作的錯誤。

但是,您退出調試會話並通過 Visual Studio Server Explorer(或任何其他合適的工具)查看您的數據庫。 此窗口具有不同的連接字符串(可能指向項目文件夾中的數據庫副本)。 您搜索您的表格,但您看不到更改。

然后問題變得更糟。 您重新啟動 VS 以尋找應用程序中的錯誤,但您在項目文件之間列出了數據庫文件,並且屬性Copy to Output directory設置為Copy Always 此時,Visual Studio 強制並將原始數據庫文件從項目文件夾復制到輸出文件夾 (BIN\\DEBUG),因此您之前的更改將丟失。

現在,您的應用程序再次插入/更新目標表,您再次無法在代碼中找到任何錯誤並再次重新啟動循環,直到您決定在 StackOverflow 上發布或搜索。

您可以停止此問題,將屬性Copy To Output Directory更改為Copy If NewerNever Copy 您還可以在服務器資源管理器中更新連接字符串以查看數據庫的工作副本或創建第二個連接。 第一個仍然指向項目文件夾中的數據庫,而第二個指向 BIN\\DEBUG 文件夾中的數據庫。 通過這種方式,您可以保持原始數據庫為部署目的和模式更改做好准備,同時,通過第二個連接,您可以查看編碼工作的有效結果。

編輯MS-Access數據庫用戶的特別警告。 如果您不編寫或更改任何內容,那么查看表的簡單操作也會更改數據庫的修改日期。 因此, Copy if Newer標志啟動並將數據庫文件復制到輸出目錄。 使用 Access 更好地使用Copy Never

跨調試會話提交更改/保存更改是 SQL CE 論壇中的一個熟悉主題。 這是很多人絆倒的事情。 我將在下面發布指向源文章的鏈接,但我想將似乎能獲得最佳結果的答案粘貼給大多數人:


您有多種選擇可以更改此行為。 如果您的 sdf 文件是項目內容的一部分,這將影響數據的持久性。 請記住,在調試時,項目的所有輸出(包括 sdf)都在 bin/debug 文件夾中。

  • 您可以決定不將 sdf 文件包含在您的項目中並管理文件位置運行時。

  • 如果您使用“如果更新則復制”,並且您對數據庫所做的項目更改將覆蓋任何運行時/調試更改。

  • 如果您使用“不復制”,則必須在代碼中指定位置(作為程序運行位置的兩個級別)。

  • 如果您有“始終復制”,則在運行期間所做的任何更改都將始終被覆蓋


答案來源

這是一些進一步討論和如何記錄的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM