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
文件 – 我几乎可以肯定你的数据在那里。
我认为真正的解决方案是
-
安装SQL Server Express(你已经完成了)
-
安装SQL Server Management Studio Express
-
在SSMS Express中创建数据库,给它一个逻辑名称(例如
VictoryDatabase
) -
使用其逻辑数据库名称 (在服务器上创建时给定)连接到它 – 并且不要乱用物理数据库文件和用户实例。 在这种情况下,您的连接字符串将是这样的:
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)); } }