c# - ExecuteNonQuery() 不保存任何记录

标签 c# database sqlcommand mdf executenonquery

我正在使用基于 WinForms 的 C# 工具,它有一个附加的基于 MDF 文件的数据库。我正在尝试使用 SqlCommand.ExecuteNonQuery() 方法将记录保存到这个附加的 MDF 数据库,但记录没有保存。没有错误或异常发生;唯一的问题是记录实际上没有保存。

我在顶部有一个 Console.WriteLine,它显示了我正在尝试运行的查询。它的语法正确,如果我从输出窗口复制粘贴它并单独运行它,它就可以工作。

我已经正确定义了如下连接字符串,它可以很好地获取记录:

public static String connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TestBuildDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

这里是我用来保存记录的函数:

public static void PerformDBWriteTransaction(string inputSQLStatement)
{
    Console.WriteLine(inputSQLStatement);
    DataTable returnDataTable = new DataTable();
    SqlConnection sqlConnection = new SqlConnection();
    sqlConnection.ConnectionString = connectionString;
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = sqlConnection;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = inputSQLStatement;
    cmd.Connection.Open();
    try
    {
        cmd.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        errorMessages.Clear();
        errorMessages.Append("The following errors were found in the SQL statement:\n\n");

        for (int i = 0; i < ex.Errors.Count; i++)
        {
            errorMessages.Append("Index #" + i + "\n" +
                "Message: " + ex.Errors[i].Message + "\n" +
                "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                "Source: " + ex.Errors[i].Source + "\n" +
                "Procedure: " + ex.Errors[i].Procedure + "\n");
        }
        MessageBox.Show(errorMessages.ToString());
    }
    finally
    {
        cmd.Connection.Close();
    }
}

谁能告诉我可能是什么问题?我是否需要以某种方式执行“提交”?

编辑:

我发现了问题,并在下面写了一个解决方案。感谢所有帮助我的人:)

最佳答案

我找到问题了!它非常简单,而且真的很愚蠢 :) ..上面的代码都是正确的..是的,人们指出了优化等,但上面的代码仍然是正确的。

问题是,当我将 TestDB.MDF 文件导入我的 Visual 2010 项目时,在项目的文件夹中创建了一个副本。当您运行/调试该程序时,将制作此文件的另一个副本并将其放入\bin\Debug\文件夹中。在我使用的连接字符串中,我曾提到:AttachDbFilename=|DataDirectory|\TestBuildDB.mdf .. 这意味着所有读/写都是对 bin\Debug 文件夹中的副本完成的。但是,我正在调查以验证是否插入了记录的 TestDB.MDF 文件位于项目的文件夹中!所以基本上,有两个 MDF 文件,我将记录写入一个文件,但试图在另一个文件中找到它们:)

当您将 MDF 文件添加到您的 VS2010 项目中时,VS2010 默认情况下会与该 MDF 文件建立连接,您可以从那里浏览该 MDF 文件中的内容。用于此目的的 MDF 文件是放置在项目的文件夹,而不是 bin\Debug\文件夹中的文件夹。正如我之前所说,我的代码使用了 bin\Debug 文件夹中的代码:)

所以我现在所做的是从我的项目中删除了 Test.MDF 文件引用,这删除了项目文件夹中存在的副本。但是,我在 bin\Debug\文件夹中有一个 TestDB.MDF 文件的副本,我从我的应用程序中连接到该文件夹​​。如果我想在我的项目之外浏览 MDf 文件,我会使用 SQL Management Studio。这里唯一的问题是 MDF 文件在给定时间只能由一个程序使用。因此,如果我必须在我的应用程序中使用它,我必须将它从 SQL Management Studio 中脱机,反之亦然!

我希望这个解释可以帮助那里的人:)

关于c# - ExecuteNonQuery() 不保存任何记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12564761/

相关文章:

c# - 使用 C# 实现 SQL 的动态参数计数

c# - DISM.exe 返回代码?

android - 从未在数据库上显式调用 Close

c# - 查询字符串和提取值的问题

c#在 "using"代码块中执行带参数的SqlCommand

c# - 如何从ms word文档的当前可见页面获取单词?

c# - 如何使用带有 stackexchange.redis 库的 ZSCAN 命令获取游标和分页的结果?

mysql - 在有或没有索引的情况下复制数据库?

c - 存储redis键的最佳方式

c# - 如果关联的 SqlConnection 将被处置,是否需要 SqlCommand.Dispose()?