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:nn");
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脱机,反之亦然!

我希望这个解释能帮助到其他人:)

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

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

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

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

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

为所有异常提供一个catch子句。如果出现SqlException以外的错误,您将永远看不到它是什么,您的数据库也将永远不会更新。想象一下有一个FormatException。。。

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

首先,您应该始终将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:nn");
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());
}
}

嗨,当我添加学生记录executionNonQuery时,我正在处理图书馆数据库显示类似无效列名的错误页面打开,但未保存数据。这里我给出了代码声明

public partial class add_student_info : Form
{
SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-SPT6GLGSQLEXPRESS;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");
}
}
}

最新更新