一尘不染

为什么将更改保存到数据库失败?

c#

我在控制台应用程序中有以下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。


阅读 433

收藏
2020-05-19

共1个答案

一尘不染

这是一个非常普遍的问题。您使用 | 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 DirectoryCopy If Newer或的问题Never Copy。您也可以在服务器资源管理器中更新连接字符串,以查看数据库的工作副本或创建第二个连接。第一个仍然指向项目文件夹中的数据库,而第二个仍然指向BIN
\ DEBUG文件夹中的数据库。这样,您可以使原始数据库为部署目的和架构更改做好准备,而通过第二个连接,您可以查看编码工作的有效结果。

EDIT Special warning for MS-Access database users. The simple act of
looking at your table changes the modified date of your database ALSO if you
don’t write or change anything. So the flag Copy if Newer kicks in and the
database file is copied to the output directory. With Access better use Copy Never.

2020-05-19