C# 为什么将更改保存到数据库失败?
我在控制台应用程序中有以下C#代码 每当我调试应用程序并运行query1(向数据库中插入新值)然后运行query2(显示数据库中的所有条目)时,我都可以清楚地看到我插入的新条目。但是,当我关闭应用程序并检查数据库中的表(在VisualStudio中)时,它就消失了。我不知道为什么它不是储蓄C# 为什么将更改保存到数据库失败?,c#,.net,sql-server-ce,C#,.net,Sql Server Ce,我在控制台应用程序中有以下C#代码 每当我调试应用程序并运行query1(向数据库中插入新值)然后运行query2(显示数据库中的所有条目)时,我都可以清楚地看到我插入的新条目。但是,当我关闭应用程序并检查数据库中的表(在VisualStudio中)时,它就消失了。我不知道为什么它不是储蓄 using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using Syste
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变体)中。这很好,因为您在连接数据库和执行更新操作时不会出现任何错误
然后,退出调试会话,并通过VisualStudioServerExplorer(或任何其他合适的工具)查看数据库。此窗口具有不同的连接字符串(可能指向项目文件夹中的数据库副本)。您搜索了表,但没有看到更改
然后问题变得更糟。您重新启动VS以查找应用程序中的错误,但您的数据库文件列在项目文件之间,并且属性Copy to Output directory
设置为Copy Always
。此时,Visual Studio强制将原始数据库文件从项目文件夹复制到输出文件夹(BIN\DEBUG),因此以前的更改将丢失
现在,您的应用程序再次插入/更新目标表,在您决定发布或搜索StackOverflow之前,您再次无法在代码中找到任何错误并重新启动循环
将属性复制到输出目录
更改为复制(如果较新)
或从不复制
,可以停止此问题。您还可以在服务器资源管理器中更新connectionstring以查看数据库的工作副本或创建第二个连接。第一个仍然指向项目文件夹中的数据库,而第二个指向BIN\DEBUG文件夹中的数据库。通过这种方式,您可以使原始数据库为部署目的和模式更改做好准备,同时,通过第二个连接,您可以查看编码工作的有效结果
编辑针对MS Access数据库用户的特别警告。如果您没有编写或更改任何内容,查看表的简单操作也会更改数据库的修改日期。因此,如果较新的启动,则标志
Copy,并且数据库文件被复制到输出目录。使用Access更好地使用从不复制
这是一个非常常见的问题。使用|DataDirectory替换字符串。这意味着,在Visual Studio环境中调试应用程序时,应用程序使用的数据库位于项目的子文件夹BIN\DEBUG
文件夹(或x86变体)中。这很好,因为您在连接数据库和执行更新操作时不会出现任何错误
然后,退出调试会话,并通过VisualStudioServerExplorer(或任何其他合适的工具)查看数据库。此窗口具有不同的连接字符串(可能指向项目文件夹中的数据库副本)。您搜索了表,但没有看到更改
然后问题变得更糟。您重新启动VS以查找应用程序中的错误,但您的数据库文件列在项目文件之间,并且属性Copy to Output directory
设置为Copy Always
。此时,Visual Studio强制将原始数据库文件从项目文件夹复制到输出文件夹(BIN\DEBUG),因此以前的更改将丢失
现在,您的应用程序再次插入/更新目标表,在您决定发布或搜索StackOverflow之前,您再次无法在代码中找到任何错误并重新启动循环
将属性复制到输出目录
更改为复制(如果较新)
或从不复制
,可以停止此问题。您还可以在服务器资源管理器中更新connectionstring以查看数据库的工作副本或创建第二个连接。第一个仍然指向项目文件夹中的数据库,而第二个指向BIN\DEBUG文件夹中的数据库。通过这种方式,您可以使原始数据库为部署目的和模式更改做好准备,同时,通过第二个连接,您可以查看编码工作的有效结果
编辑针对MS Access数据库用户的特别警告。如果您没有编写或更改任何内容,查看表的简单操作也会更改数据库的修改日期。因此,如果较新的
启动,则标志Copy,并且数据库文件被复制到输出目录。使用Access更好地使用Copy Never
跨调试会话提交更改/保存更改是SQL CE论坛中熟悉的主题。这件事让很多人都大吃一惊。我将在下面发布源文章的链接,但我想粘贴的答案似乎对大多数人来说效果最好:
您有几个选项可以更改此行为。如果sdf文件是项目内容的一部分,这将影响数据的持久化方式。请记住,调试时,项目的所有输出(包括sdf)都位于bin/debug文件夹中
- 您可以决定不将sdf文件作为项目的一部分,并管理文件位置运行时
- 如果您使用的是“更新时复制”和project cha