数据不会永久保存到SQL表

时间:2014-05-06 13:41:23

标签: c# sql wpf

我在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>

5 个答案:

答案 0 :(得分:13)

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

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

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

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

答案 1 :(得分:2)

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

您确定要正确刷新桌面视图吗?您确定要检查正确数据库中的正确表吗?

答案 2 :(得分:0)

确保在连接字符串中设置了初始目录,并确保指向正确的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。使用初始目录。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

在史蒂夫的答案下面,您可以在属性窗口中获取数据库的完整路径,并用| DataDirectory |代替它。字符串连接。

您的代码将类似于

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