ExecuteNonQuery()不保存任何记录

时间:2012-09-24 12:06:40

标签: 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();
    }
}

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

编辑:

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

6 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:3)

这个问题的解决方案非常简单,只需在连接字符串中给出原始MDF文件的完整路径,如下所示:

connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=**C:\VISUAL STUDIO 2012\PROJECTS\ENGLISHTOHINDIDICTIONARY\ENGLISHTOHINDIDICTIONARY\DICTIONARY.MDF**;Initial Catalog=Dictionary;Integrated Security=false"
        providerName="System.Data.SqlClient"

就是这样,你的问题就解决了。

答案 2 :(得分:2)

我遇到了同样的挑战,我只是将数据库属性“Copy to Output Directory”从“Copy always”改为“Do not copy”,然后将我的database.mdf(从我的IDE中拖放)移到bin中\ debug文件夹。

提示: bin目录通常是隐藏的,使用“显示所有文件”来显示它

答案 3 :(得分:0)

为所有例外提供catch子句。如果除了SqlException之外还有其它错误,你将永远不会看到它是什么,并且你的数据库将被更新。想象一下有一个FormatException ...

同时检查ExecuteNonQuery的返回:它是受查询影响的行数。

答案 4 :(得分:0)

首先,您应该始终将IDisposable对象包装在using中,以确保它们已被关闭并正确处理(并且连接池可以完成它的工作)。其次,当修改数据时,在事务中包装你的sql以保持数据的完整性。

尝试以下代码,看看是否引发了任何异常。我通常不会建议捕捉Exception,因为它太笼统了,我会让这个泡泡到调用机制并在那里处理它 - 但是对于这个实例它会告诉你任何和所有问题。我认为您的特定问题出在连接的.Open阶段,因此请尝试逐步完成。

public static void PerformDBWriteTransaction(string inputSQLStatement)
{
    DataTable returnDataTable = new DataTable();

    try
    {
        using (SqlConnection sqlConnection = new SqlConnection(connectionString))
        {
            sqlConnection.Open();

            using (SqlTransaction sqlTrans = sqlConnection.BeginTransaction())
            {
                try
                {
                    using (SqlCommand cmd = new SqlCommand(inputSQLStatement, sqlConnection))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Transaction = sqlTrans;
                        cmd.ExecuteNonQuery();
                    }
                }
                catch (SqlException sqlEx)
                {
                    sqlTrans.Rollback();

                    throw sqlEx;
                }

                sqlTrans.Commit();
            }
        }
    }
    catch (Exception 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());
    }
}

答案 5 :(得分:-1)

您好我在添加学生记录executionNonQuery时正在使用图书馆数据库 显示错误,如无效列名页面打开但保存数据不会发生。 在这里,我给出了代码声明

public partial class add_student_info : Form
{
    SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-SPT6GLG\SQLEXPRESS;Initial Catalog=library_managment;Integrated Security=True;Pooling=False");

    public add_student_info()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "insert into student_info values('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "'," + textBox5.Text + "," + textBox6.Text + "," + textBox7.Text + ")";
            cmd.ExecuteNonQuery();
            con.Close();

            MessageBox.Show("Student recorc addedd sussfully");

        }
    }
}