gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:03:28 25 4
gpt4 key购买 nike

我在控制台应用程序中有以下 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 变体)中。这很有效,因为您在连接数据库和进行更新操作时没有任何类型的错误。

然后,您退出调试 session ,并通过 Visual Studio Server Explorer(或任何其他合适的工具)查看数据库。该窗口有一个不同的连接字符串(可能指向项目文件夹中数据库的副本)。您搜索表格,但没有看到更改。

那么问题就会变得更糟。您重新启动 VS 以寻找应用中的错误,但您的数据库文件列在项目文件之间,并且属性复制到输出目录设置为始终复制 。此时,Visual Studio 会强制将原始数据库文件从项目文件夹复制到输出文件夹 (BIN\DEBUG),因此您之前的更改将会丢失。

现在,您的应用程序再次插入/更新目标表,您再次在代码中找不到任何错误,并再次重新启动循环,直到您决定在 StackOverflow 上发布或搜索。

您可以通过单击解决方案资源管理器中列出的数据库文件并将属性复制到输出目录更改为如果较新则复制从不来阻止此问题复制。您还可以在服务器资源管理器中更新连接字符串以查看数据库的工作副本或创建第二个连接。第一个仍然指向项目文件夹中的数据库,而第二个指向 BIN\DEBUG 文件夹中的数据库。通过这种方式,您可以使原始数据库为部署目的和架构更改做好准备,同时通过第二个连接,您可以查看编码工作的有效结果。

编辑针对MS-Access数据库用户的特别警告。如果您不写入或更改任何内容,那么查看表的简单操作也会更改数据库的修改日期。因此,标志 Copy if Newer 启动,数据库文件被复制到输出目录。借助 Access,更好地使用从不复制

关于c# - 为什么将更改保存到数据库失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48125657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com