使用While循环向数据库写入递增价格失败,寻求技术帮助
排查你的循环写入数据库失效问题
我来帮你梳理下这段代码里的几个关键问题,正是它们导致了循环写入功能异常:
- 循环内的
Console.ReadKey()阻塞了流程:每次插入一条数据后,程序会卡在这一步等待你按下按键才会继续下一次循环,你可能误以为程序没运行,但其实它只是在等待输入。 - 空catch块吞掉了所有异常:不管是SQL语法错误、数据库连接失败还是其他问题,你都看不到任何错误提示,完全没法定位问题根源。
- 字符串拼接SQL存在语法风险:double类型的
Add转字符串时,可能因为系统区域设置(比如用逗号代替小数点)导致SQL语句语法错误,而且这种写法还存在SQL注入隐患。 - 未正确管理数据库连接:每次循环都新建
SqlConnection,却没有确保连接被关闭,容易造成连接池耗尽,后续操作无法执行。
修正后的代码
namespace Testing { class Program { static void Main(string[] args) { string connectionString = @".........."; // 替换为你的实际连接字符串 string buyable = "0"; // 如果Buyable是整数类型,建议直接用int类型 int count = 10; double currentPrice = 0.00000000; const double priceIncrement = 0.00000005; // 使用using语句自动管理连接资源,确保连接被正确关闭 using (SqlConnection con = new SqlConnection(connectionString)) { try { con.Open(); Console.WriteLine("Database connected"); // 提前定义SQL语句,使用参数化查询避免语法错误和注入风险 string query = "INSERT INTO [dbo].[Table] ([Price], [Buyable]) VALUES (@Price, @Buyable)"; using (SqlCommand ins = new SqlCommand(query, con)) { // 根据你的表结构调整参数类型(比如Price如果是decimal就用SqlDbType.Decimal) ins.Parameters.Add("@Price", SqlDbType.Float); ins.Parameters.Add("@Buyable", SqlDbType.VarChar); for (int i = 0; i < count; i++) { currentPrice += priceIncrement; // 循环更新参数值,复用命令对象提升性能 ins.Parameters["@Price"].Value = currentPrice; ins.Parameters["@Buyable"].Value = buyable; int rowsAffected = ins.ExecuteNonQuery(); Console.WriteLine($"第{i+1}条数据存储成功,影响行数:{rowsAffected}"); } } } catch (SqlException ex) { // 输出SQL相关错误信息,方便调试 Console.WriteLine($"数据库操作错误:{ex.Message}"); } catch (Exception ex) { // 捕获其他类型的异常 Console.WriteLine($"程序错误:{ex.Message}"); } Console.WriteLine("所有操作完成,按任意键退出..."); Console.ReadKey(); } } } }
关键修改说明
using语句管理资源:自动处理连接和命令对象的释放,避免资源泄漏。- 参数化查询:彻底解决字符串拼接带来的格式问题和安全风险,确保数值类型正确传递给数据库。
- 移除循环内的
Console.ReadKey():让循环自动执行完所有插入操作,最后再统一等待按键退出。 - 添加异常信息输出:出问题时能直接看到错误原因,快速定位问题。
- 复用
SqlCommand对象:不用每次循环都新建命令,提升程序性能。
内容的提问来源于stack exchange,提问作者Kabundscha
相关产品推荐
相关产品推荐

