C#中的SQL插入查询不会更新数据库

这是我的代码。 程序运行正常。 我没有任何例外。 但最后,该表不包含新插入的行。 (注意,连接字符串是正确的)。

string Name = "myname"; string Age = "myage"; string sql = "INSERT INTO Student (Name, Age) VALUES ('" + Name + "','" + Age + "')"; SqlConnection conn = new SqlConnection(ConfigHelper.GetConnectionString()); SqlCommand cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); conn.Close(); 

首先: 开始使用参数化查询! 否则,您的代码始终对SQL注入攻击开放 – 而不是您想要处理的内容。

假设您正在使用此function(取决于您在原始问题中未向我们展示的连接字符串):整个用户实例和AttachDbFileName =方法存在缺陷 – 充其量! Visual Studio将复制.mdf文件, 很可能 ,你的INSERT工作得很好 – 但你最后只是查看错误的.mdf文件

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

我认为真正的解决方案

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

  2. 安装SQL Server Management Studio Express

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

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

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

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

导致问题的主要问题是连接永远不会打开。

在连接打开之前,您无法执行该命令


还有一些其他问题:

  • 我看到没有error handling,这将帮助您识别错误。 可能有些事情吞噬了你的错误,所以你没有看到它们。
  • 您正在为字符串提供支持,这使您可以使用SQL注入 。 我强烈建议您学习参数化查询 。
  • 您没有使用using语句进行连接,这将确保自动关闭和处理

这里列出了几种最佳实践。 以下是正确使用“使用”语句的摘录。

在C#中使用“Using”语句

对于C#程序员,确保始终关闭Connection和DataReader对象的便捷方法是使用using语句。 在离开using语句的范围时,using语句会自动调用Dispose对被“使用”的对象。 例如:

 //C# string connString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"; using (SqlConnection conn = new SqlConnection(connString)) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "SELECT CustomerId, CompanyName FROM Customers"; conn.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) Console.WriteLine("{0}\t{1}", dr.GetString(0), dr.GetString(1)); } }