数据不会永久保存到SQL表

mkm*_*ell 2 c# sql wpf

我在Visual Studio Express 2012中使用C#作为WPF应用程序.我按照此处的教程进行操作.我创建了一个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

连接字符串:

<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>
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 13

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

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

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

只需将属性更改Copy to the Output directoryCopy if newer,代码就可以正常工作.
(Peraphs现在还为时过早,但请记住将查询更改为参数化查询.因此,您可以简单地在txtName文本框中插入单引号来破坏您的代码O'Malley,更不用说Sql Injection hack了)