LocalDB MDF 文件 属性 "Copy if newer" 是如何工作的
How LocalDB MDF file property "Copy if newer" works
我在 Visual Studio 2012 年使用 .NET Framework 4.5 开发我的应用程序并使用 MDF 文件作为本地数据库。这里的问题是在运行时对数据所做的更改不会永久保存。但是,我能够在运行时检索数据甚至保存它,但它们不会显示在服务器资源管理器中。我已经将MDF文件的"Copy to Output directory" 属性设置为"Copy if newer",但问题依然存在。我该如何解决?
这是我应用程序 app.config 中的连接字符串。我之前曾尝试过单独的数据集 .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>
有些人可能会建议:
- 使用 SQLExpress 作为服务器而不是 LocalDB 或者
- 尝试以编程方式连接到 LocalDB 并替换 bin\Debug
"folder_name\file_name.mdf"
但是它们不是实际的解决方案,只是替代方案。谁能解释一下这里发生了什么?我该如何解决?
根据要求,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.");
}
它确实显示了一个消息框,我还看到调试时受影响的行数。
我从@SamiKuhmonen 和@BrendanGreen 那里得到了关于这个问题的帮助,解决方案是我正在通过服务器资源管理器检查项目文件夹的 MDF 文件中是否存在数据,我应该做的是检查 MDF bin\Debug 文件夹中的文件,我的数据是永久文件夹。我通过在服务器资源管理器中创建一个新连接来输出 MDF 文件来做到这一点。我错误地认为更新的 MDF 文件将覆盖项目文件夹中的文件,因为它应该是 "Copy if newer" 的功能。实际上它将原始文件复制到 bin 文件夹而不是其他方式。很明显,对于全新安装,MDF 填充将为空,部署后,用户端的应用程序将仅引用部署的文件,即类似于 bin\Debug.
中的文件
我在 Visual Studio 2012 年使用 .NET Framework 4.5 开发我的应用程序并使用 MDF 文件作为本地数据库。这里的问题是在运行时对数据所做的更改不会永久保存。但是,我能够在运行时检索数据甚至保存它,但它们不会显示在服务器资源管理器中。我已经将MDF文件的"Copy to Output directory" 属性设置为"Copy if newer",但问题依然存在。我该如何解决?
这是我应用程序 app.config 中的连接字符串。我之前曾尝试过单独的数据集 .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>
有些人可能会建议:
- 使用 SQLExpress 作为服务器而不是 LocalDB 或者
- 尝试以编程方式连接到 LocalDB 并替换 bin\Debug "folder_name\file_name.mdf"
但是它们不是实际的解决方案,只是替代方案。谁能解释一下这里发生了什么?我该如何解决?
根据要求,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.");
}
它确实显示了一个消息框,我还看到调试时受影响的行数。
我从@SamiKuhmonen 和@BrendanGreen 那里得到了关于这个问题的帮助,解决方案是我正在通过服务器资源管理器检查项目文件夹的 MDF 文件中是否存在数据,我应该做的是检查 MDF bin\Debug 文件夹中的文件,我的数据是永久文件夹。我通过在服务器资源管理器中创建一个新连接来输出 MDF 文件来做到这一点。我错误地认为更新的 MDF 文件将覆盖项目文件夹中的文件,因为它应该是 "Copy if newer" 的功能。实际上它将原始文件复制到 bin 文件夹而不是其他方式。很明显,对于全新安装,MDF 填充将为空,部署后,用户端的应用程序将仅引用部署的文件,即类似于 bin\Debug.
中的文件