无法向SQL Server数据库导入值 执行插入无报错但数据未生效
核心问题定位
你的代码存在两个直接导致插入不生效的硬错误,和一个配置类的常见坑:
- 连接关闭逻辑完全失效:
Close_DB_Connection()方法中新建了一个全新的SqlConnection实例执行关闭操作,和之前Get_DB_Connection()返回的、实际执行插入命令的数据库连接没有任何关联,导致执行插入的连接从未被正确释放,操作变更没有被持久化提交,还会产生连接泄漏。 - 插入语句缺省
INTO关键字虽然不会直接触发语法报错,但在部分兼容级别下会导致执行行为异常;另外你当前的写法没有捕获ExecuteNonQuery()的返回值,根本无法确认语句实际有没有执行成功。 - 如果你使用的是LocalDB挂载项目目录下的mdf文件,VS默认的「始终复制」配置会在每次调试启动时,用项目根目录下的空原始库覆盖输出目录(bin/debug文件夹)中已经写入数据的库副本,你每次查看的都是被覆盖后的空库,自然看不到数据。你看到的版本兼容报错,本质是同时打开了两个指向不同路径同名mdf文件的连接,实例版本冲突导致的。
修复方案
- 废弃你手写的独立Open/Close封装,C#操作SQL Server请直接用
using块实现资源的自动释放,从根源上避免连接泄漏、事务未提交的问题,参考修正后的代码:
public static void AddDataValues() { string cnString = Properties.Settings.Default.birdCategoriesConnectionString; // using块离开作用域时会自动关闭、释放连接,无需手动写Close逻辑 using (SqlConnection conn = new SqlConnection(cnString)) { conn.Open(); // 补全INTO关键字,改用参数化查询避免语法问题和注入风险 string insertSql = "INSERT INTO dbo.DivisionTable (Id, Name, Description) VALUES (@Id, @Name, @Desc)"; using (SqlCommand cmd = new SqlCommand(insertSql, conn)) { cmd.Parameters.AddWithValue("@Id", 4); cmd.Parameters.AddWithValue("@Name", "Name"); cmd.Parameters.AddWithValue("@Desc", "Desc"); // 捕获受影响行数,返回1才代表插入成功 int affectCount = cmd.ExecuteNonQuery(); Debug.WriteLine($"插入执行完成,受影响行数:{affectCount}"); } } }
- 修改mdf文件的复制规则:在解决方案资源管理器中找到项目内的
.mdf数据库文件,右键打开属性面板,将「复制到输出目录」选项从默认的「始终复制」修改为「如果较新则复制」,避免每次调试都用原始空库覆盖已写入数据的副本。 - 排查服务器资源管理器中的数据库连接,删除所有指向同名mdf的冗余连接,确认你查看数据用的连接和代码中连接字符串指向的是同一个库文件,就不会再弹出版本兼容的错误提示。
验证方式
在ExecuteNonQuery()执行行加断点调试,确认返回的受影响行数为1后,停止调试再刷新表视图,就能看到成功插入的测试数据。不要在调试进程运行过程中刷新视图,此时文件被调试进程占用,也会导致读取异常。
内容的提问来源于stack exchange,提问作者Sky
相关产品推荐
相关产品推荐

