【问题标题】:C# Service Based Database not writing to DB基于 C# 服务的数据库未写入数据库
【发布时间】:2025-11-28 18:05:02
【问题描述】:

我正在尝试在 Visual Studio C# 中编写应用程序以写入基于服务的数据库。我遇到的问题是我没有收到任何错误,但是重新启动应用程序后没有任何内容保存到数据库中......

我知道它正在写入,因为它不允许重复的主键。就好像它是一个临时数据库......如果是这种情况,我如何使它成为一个基于持久服务的数据库?

这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    try {
        // Connection to DB
        SqlConnection con = new SqlConnection();
        con.ConnectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MTR_Database.mdf;Integrated Security=True");

        // Insert Query
        string insertquery = "INSERT INTO dbo.Job01 ([Item #], [Manufacturer], [Mill Location], [Product Description], [Weld Seam Type], [Outer Dimension], [Wall Thickness], [Coating], [Grade], [Heat], [ANSI/ASME], [Purchase Order], [Standard]) VALUES(@ItemNum, @Manufacturer, @MillLocation, @ProductDescription, @WeldSeamType, @OuterDimension, @WallThickness, @Coating, @Grade, @Heat, @ANSIASME, @PurchaseOrder, @Standard)";

        SqlCommand cmd = new SqlCommand(insertquery, con);

        // open connection
        con.Open();

        // Parameters
        cmd.Parameters.AddWithValue("@ItemNum", item__TextBox.Text);
        cmd.Parameters.AddWithValue("@Manufacturer", manufacturerTextBox.Text);
        cmd.Parameters.AddWithValue("@MillLocation", mill_LocationTextBox.Text);
        cmd.Parameters.AddWithValue("@ProductDescription", product_DescriptionTextBox.Text);
        cmd.Parameters.AddWithValue("@WeldSeamType", weld_Seam_TypeTextBox.Text);
        cmd.Parameters.AddWithValue("@OuterDimension", outer_DimensionTextBox.Text);
        cmd.Parameters.AddWithValue("@WallThickness", wall_ThicknessTextBox.Text);
        cmd.Parameters.AddWithValue("@Coating", coatingTextBox.Text);
        cmd.Parameters.AddWithValue("@Grade", gradeTextBox.Text);
        cmd.Parameters.AddWithValue("@Heat", heatTextBox.Text);
        cmd.Parameters.AddWithValue("@ANSIASME", aNSI_ASMETextBox.Text);
        cmd.Parameters.AddWithValue("@PurchaseOrder", purchase_OrderTextBox.Text);
        cmd.Parameters.AddWithValue("@Standard", standardTextBox.Text);

        // Execute
        cmd.ExecuteNonQuery();

        // close connection
        con.Close();
    }
    catch (Exception ex)
    {
        // catch error
        MessageBox.Show(ex.Message);
    }
}

我真的不知道发生了什么。

【问题讨论】:

  • 我想更多的是,我希望它充当 SQLite... 没有活动服务器并在应用程序内。这可以通过嵌入在 Visual Studio 中的 SQL Express 实现吗?
  • 阅读此内容:*.com/questions/6221951/… 关于 SQL-Server 的异常处理。还可以使用 MDF 的直接文件路径,看看会发生什么

标签: c# sql-server visual-studio insert


【解决方案1】:

整个 AttachDbFileName= 方法是有缺陷的 - 充其量!在 Visual Studio 中运行您的应用程序时,它将复制 .mdf 文件(从您的 App_Data 目录到输出目录 - 通常是 .\bin\debug - 您的应用程序运行的位置)并且很可能 ,您的 INSERT 工作正常 - 但您最终只是查看了错误的 .mdf 文件

如果您想坚持使用这种方法,请尝试在 myConnection.Close() 调用上设置断点 - 然后使用 SQL Server Mgmt Studio Express 检查 .mdf 文件 - 我几乎可以确定您的数据在那里。

在我看来,真正的解决方案

  1. 安装 SQL Server Express(反正你已经完成了)

  2. 安装 SQL Server Management Studio Express

  3. SSMS Express中创建你的数据库,给它一个逻辑名称(例如MTR_Database

  4. 使用它的逻辑数据库名称(在服务器上创建它时给出)连接到它——不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.\\SQLEXPRESS;Database=MTR_Database;Integrated Security=True
    

    其他一切都完全和以前一样......

有关更多背景信息,另请参阅 Aaron Bertrand 的优秀博文 Bad habits to kick: using AttachDbFileName

【讨论】:

  • 会做@marc_s 谢谢你的信息......我会试试这个。我已经在 MySql 中工作了很多,但是尝试切换到 SQL 工作......到目前为止,这是一次可怕的经历。除了这个事实,我将再次致力于此。如果它有效,我会支持答案:)我可能会在明天完成它,因为快下班了:(
  • 你完全正确...我正在查看错误的数据库文件。一切都正确插入。我想我必须学习如何制作一个新服务器并给它一个数据库名称。然后我几乎可以像对待 mySQL 一样对待它。我可能只是从服务器而不是本地运行它。
【解决方案2】:

我以前遇到过这个问题,刚刚解决了。

不要使用|DataDirectory|\MTR_Database.mdf,使用完整路径。

【讨论】: