LocalDB MDF文件属性“如果更新则复制”的工作原理

时间:2015-04-29 12:34:11

标签: c# sql .net localdb

我正在使用.NET Framework 4.5在Visual Studio 2012中开发我的应用程序,并使用MDF文件作为本地数据库。这里的问题是在运行时对数据所做的更改不会永久保存。但是,我能够在运行时检索数据,即使保存它,但它们不会显示在Server explorer中。我已经将MDF文件的“复制到输出目录”属性设置为“如果更新则复制”,但问题仍然存在。我该如何解决?

这是我的应用程序的app.config中的连接字符串。我之前尝试过Seperate数据集.xsd文件,但无济于事。

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

有些人可能建议:

  1. 使用SQLExpress作为服务器而不是LocalDB或
  2. 尝试以编程方式连接到LocalDB并替换bin \ Debug 使用“folder_name \ file_name.mdf”
  3. 然而它们不是实际的解决方案,只是替代方案。有谁能解释这里发生了什么?我该如何解决呢?

    根据要求,C#代码为:

    DateTime dt = DateTime.Now;
    string CDate = dt.Month + "/" + dt.Day + "/" + dt.Year;
    int norid = 0, neeid = 0, cfrom = 0, cto=0;
    
    SqlConnection SCon = new SqlConnection(ConfigurationManager.ConnectionStrings["EA_Logistics_Control.Properties.Settings.LogisticsLocalDBCS"].ConnectionString);
    
    if (SCon.State == ConnectionState.Closed)
        SCon.Open();
    SqlCommand SCom = new SqlCommand("INSERT INTO Consignments VALUES(@CNo, @CDate, @InvoiceNo, @SignorID, @SigneeID, @TravelFrom, @TravelTo, @Packages, @Contents, @VehicleNo, @Rate, @Weight, @Amount, '')", SCon);
    
    SCom.Parameters.AddWithValue("CNo", TB_IC_CN.Text);
    SCom.Parameters.AddWithValue("CDate", CDate);
    SCom.Parameters.AddWithValue("InvoiceNo", TB_IC_O_Inv.Text);
    SCom.Parameters.AddWithValue("SignorID", norid);
    SCom.Parameters.AddWithValue("SigneeID", neeid);
    SCom.Parameters.AddWithValue("TravelFrom", cfrom);
    SCom.Parameters.AddWithValue("TravelTo", cto);
    SCom.Parameters.AddWithValue("Packages", TB_IC_NUM_O_Pkgs.Text);
    SCom.Parameters.AddWithValue("Contents", TB_IC_Desc.Text);
    SCom.Parameters.AddWithValue("VehicleNo", TB_IC_O_Veh.Text);
    SCom.Parameters.AddWithValue("Rate", TB_IC_NUM_O_Rate.Text);
    SCom.Parameters.AddWithValue("Weight", TB_IC_NUM_O_Wt.Text);
    SCom.Parameters.AddWithValue("Amount", TB_IC_NUM_Amt.Text);
    int resRows = SCom.ExecuteNonQuery();
    if (resRows > 0)
    {
        MessageBox.Show("New entry has been inserted.");
    }
    

    它确实显示了一个消息框,我还看到了调试时受影响的行数。

1 个答案:

答案 0 :(得分:1)

我收到了来自@SamiKuhmonen和@BrendanGreen的关于此问题的帮助,解决方案是我通过服务器资源管理器检查项目文件夹的MDF文件中是否存在数据,我应该做的是检查MDF文件bin \ Debug文件夹,我的数据是永久性的。我通过在服务器资源管理器中创建一个新连接来输出MDF文件。我错误地认为更新的MDF文件将覆盖项目文件夹中的文件,因为它应该是“如果更新则复制”的功能。实际上它将原始文件复制到bin文件夹而不是其他方式。很明显,对于全新安装,MDF填充将为空,在部署之后,用户端的应用程序将仅引用已部署的文件,即类似于bin \ Debug中的文件。