数据未永久保存到 SQL 表

Posted

技术标签:

【中文标题】数据未永久保存到 SQL 表【英文标题】:Data not saving permanently to SQL table 【发布时间】:2014-06-23 04:00:12 【问题描述】:

我在 Visual Studio Express 2012 中将 C# 用于 WPF 应用程序。我按照找到的教程 here。 我创建了一个testDb.mdf 本地基于服务的数据库。我打开应用程序,输入文本,点击添加,数据添加到数据库中。我只知道这一点,因为我将一个字段设置为主键并且是唯一的。如果我再次尝试添加相同的内容,我会收到一条错误消息,指出它已经存在。

当我退出我的应用程序时,数据库中没有任何显示。我输入的数据不见了。为什么数据不是永久的?

这是我用于单击按钮的代码:

private void Add_Click(object sender, RoutedEventArgs e)

    SqlConnection cn = new SqlConnection(global::testdb.Properties.Settings.Default.testDBConnectionString);
    try 
     
        string sql = "INSERT INTO Test (TestInsert) Values('" + txtName.Text + "')";
        SqlCommand cmd = new SqlCommand(sql, cn);
        cn.Open();
        cmd.ExecuteNonQuery();

        MessageBox.Show("Added new record", "Message", MessageBoxButton.OK);
    
    catch (Exception ex) 
    
        MessageBox.Show(ex.Message,"Error", MessageBoxButton.OK);
    
    finally
    
        cn.Close();
    

连接字符串:

<connectionStrings>
    <add name="testdb.Properties.Settings.testDBConnectionString"
        connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\testDB.mdf;Integrated Security=True"
        providerName="System.Data.SqlClient" />
</connectionStrings>

【问题讨论】:

你如何检查你的桌子? 可能跟交易有关。 不正常吗?如果我清楚地理解,您可以尝试在表中添加另一个具有相同值的主键。 你不能在PK字段列中添加相同的东西,相同的值 请出示您的连接字符串 【参考方案1】:

这是一种常见的情况。您有一个使用替换字符串 |DataDirectory| 的连接字符串。在桌面应用程序中,此目录通常与您的程序运行所在的目录相同。在 Visual Studio 中,您的程序在 BIN\DEBUG(或 x86 变体)目录中运行。因此,Visual Studio 将您的 MDF 文件从项目目录复制到 BIN\DEBUG 文件夹。您将记录添加到此副本,而不是项目文件夹中的副本。但是,Visual Studio 服务器资源管理器窗口有一个指向项目文件夹数据库的连接,当然该数据库仍然是空的。

您可以向服务器资源管理器添加另一个指向文件夹 BIN\DEBUG 的连接,并检查您的数据库是否已更新。

更复杂的是,与 MDF 文件关联的属性 Copy to the Output Directory。如果此属性设置为Copy Always 每次您在 Visual Studio 中启动新会话时,该文件会再次从项目文件夹复制到输出目录 (BIN\DEBUG),并用新的空文件覆盖已经存在的副本。所以第一次运行成功,第二次失败。 您观察到的症状是这种情况的明显迹象。

只需将属性Copy to the Output directory更改为Copy if newer,代码运行良好。 (现在还为时过早,但请记住将您的查询更改为参数化查询。按原样,您可能会破坏您的代码,只需在 txtName 文本框中插入一个单引号,如O'Malley,更不用说Sql Injection hack)

【讨论】:

是的,你成功了。现在我只需要弄清楚如何嵌入这个数据库,以便它总是使用相同的东西。感谢您的帮助!【参考方案2】:

我认为您的问题不在于插入代码。这与您自己检查数据库/表的方式有关。特别是因为您说您遇到了主键错误,所以正在向表中添加一些内容。

您确定您正在正确刷新表格视图吗?您确定您正在检查正确数据库中的 right 表吗?

【讨论】:

我启动程序,输入值'test'然后回车。它补充说。我尝试再次输入值'test',它给了我错误。我关闭程序并重新打开它。我尝试再次输入值“测试”,它添加了罚款。【参考方案3】:

确保在连接字符串中设置了初始目录,并确保指向正确的服务器/SQL 实例。您可能在同一台服务器或您正在使用的任何数据库服务器上拥有多个 SQL Server 实例。当然,还要确保你去到正确的桌子。

using (SqlConnection cn = new SqlConnection(@"Persist Security Info=False;Integrated Security=true;Initial Catalog=testDB;server=(local)"))
           
            string sql = "INSERT INTO Test (TestInsert) Values('" + txtName.Text + "')";
            SqlCommand cmd = new SqlCommand(sql, cn);
            cn.Open();
            cmd.ExecuteNonQuery();
            MessageBox.Show("Added new record", "Message", MessageBoxButton.OK);


在 SQL Server Studio 中检查数据库是否存在。我不建议在代码中直接使用 AttachDbFilename 使用文件名 mdf。使用初始目录。

【讨论】:

【参考方案4】:

好吧,我找到了解决方案。我通过为 Visual Studio 安装 SSDT(SQL 服务器数据工具)解决了这个问题。根据您的 Visual Studio 版本安装它。转到以下链接下载 Visual Studio 的 SSDT。 https://msdn.microsoft.com/en-us/mt186501

【讨论】:

SSDT 不需要与 WPF 应用程序中的 SQL 数据库进行交互。如果您希望能够使用 Visual Studio 中的工具与数据库进行交互,那就是这样。【参考方案5】:

在史蒂夫的回答中,您可以在属性窗口中获取数据库完整路径并将其替换为 |DataDirectory|在字符串连接中。

你的代码会像

conn.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=G:\MhD\c#\phonebook\phonebook\phonebook\tellbook.mdf;Integrated Security=True";

【讨论】:

以上是关于数据未永久保存到 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

Unicode数据未使用webapi以正确的格式保存在sql数据库中

将数据从临时表导入永久表时出现动态 SQL 错误

CakePHP 1.3 未保存到数据库但 sql 语句正确且 insertID 正确增加

C++写文件再次运行程序后,之前保存的文件的数据就没有了,如何让数永久保存?

VS LoadTest 不会将结果保存到 SQL Server

三万字91道MySQL面试题。 附PDF