C#连接SQL Server数据未保存问题排查求助
排查C# Active Record模式写入SQL Server失败问题
先看你提供的代码,问题主要集中在C#的Save方法里,两个关键错误直接导致数据根本没被插入到数据库:
1. 完全没执行插入命令
你的Save方法仅仅是打开了数据库连接,但从来没调用command.ExecuteNonQuery()来执行INSERT语句!打开连接只是建立了和数据库的通信通道,真正触发SQL执行的步骤被彻底漏掉了。
2. SQL参数名不匹配
你写的INSERT语句里用的参数是@nom,但C#代码里添加的参数却是@nam——参数名完全对不上,就算你执行了命令,SQL Server也找不到对应的值,插入操作同样会失败。
另外还有几个可以优化的细节:
- 用
using语句自动管理SqlConnection和SqlCommand的生命周期,避免手动关闭连接时可能出现的疏漏 - 捕获具体的
SqlException,能帮你快速定位数据库层面的错误(比如主键重复、权限不足等)
修正后的C# Save方法代码
public bool Save() { string strCon = "Data Source=FACUNDO\\USARESTESQLSERVE; Initial Catalog = TestDB; Integrated Security = SSPI; "; // 使用using自动释放数据库连接资源 using (SqlConnection con = new SqlConnection(strCon)) { string insert = "INSERT INTO Neighborhood (Name, Description) VALUES (@name, @desc);"; using (SqlCommand command = new SqlCommand(insert, con)) { // 修正参数名,和SQL语句中的参数保持一致 command.Parameters.AddWithValue("@name", this.Name); command.Parameters.AddWithValue("@desc", this.Description); try { con.Open(); // 执行插入命令,返回受影响的行数 int rowsAffected = command.ExecuteNonQuery(); // 受影响行数大于0,说明插入成功 return rowsAffected > 0; } catch (SqlException ex) { // 打印异常信息方便排查,比如主键重复的错误 Console.WriteLine($"数据库错误:{ex.Message}"); return false; } // using块会自动关闭连接,无需手动写finally } } }
SQL部分的注意点
你把Name设为主键,意味着不能插入重复的Name值,如果控制台输入的名称已经存在,插入会直接失败。如果业务上允许重复名称,建议把主键改成自增ID列,比如:
CREATE TABLE Neighborhood ( Id INT IDENTITY(1,1) PRIMARY KEY, Name VARCHAR(30) NOT NULL, Description VARCHAR(50) NOT NULL )
测试建议
修改代码后,调用Save方法时可以捕获它的返回值,如果返回false,查看控制台输出的错误信息,就能快速定位问题(比如连接字符串错误、主键重复等)。
内容的提问来源于stack exchange,提问作者Facundo Fonseca
相关产品推荐
相关产品推荐

