C# 如何将SELECT查询返回的多条结果循环插入到数据库
问题根因
你的现有代码在SqlDataReader的循环读取过程中,每次都会覆盖id_Capa、pagamentoData两个变量的取值,循环结束后这两个变量只会保留查询结果最后一条的数值,后续只执行了一次插入操作,因此只会写入单条数据。
推荐方案:直接在数据库层面完成插入(最优)
不需要将数据读取到应用层再回写,直接使用INSERT INTO ... SELECT语法就能一步完成所有符合条件数据的插入,性能更高、代码更精简,同时避免SQL注入风险:
{ string cs = @"Data Source=xxxx"; // 使用using自动释放数据库资源,无需手动调用Close() using SqlConnection cn = new SqlConnection(cs); cn.Open(); Console.WriteLine("established connection"); // 直接用INSERT + SELECT完成批量插入,注意根据你的表实际字段名调整INSERT后的字段列表 string insertQuery = @" INSERT INTO capas_faturamentos ( -- 这里请替换为你表实际的字段名,避免表结构变更后插入报错 id_capa, campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8, campo9, campo10, campo11, campo12, campo13, campo14, campo15, campo16, campo17, campo18, mensal ) SELECT a.id_capa, a.pagamentodata, a.pagamentodata, a.pagamentodata, a.pagamentodata, a.pagamentodata, a.pagamentodata, '0', '0', '0', '0', '0', '0', NULL, NULL, NULL, NULL, NULL, NULL, '1' FROM capas_faturamentos AS a INNER JOIN capas AS b ON a.id_capa = b.id_capa WHERE b.id_status = 4 AND a.mensal = 1 AND MONTH(a.pagamentodata) != MONTH(GETDATE()) "; SqlCommand cmd = new SqlCommand(insertQuery, cn); int result = cmd.ExecuteNonQuery(); Console.WriteLine($"{result} 条记录已插入capas_faturamentos表"); }
方案二:如果需要在应用层处理每条数据再插入
如果你需要在C#中对每条查询结果做额外业务处理再插入,可以按如下逻辑修正代码,注意使用参数化查询避免SQL注入:
{ string cs = @"Data Source=xxxx"; List<(int IdCapa, DateTime PagamentoData)> dataList = new List<(int, DateTime)>(); // 第一步:查询符合条件的数据存入列表 using (SqlConnection cn = new SqlConnection(cs)) { cn.Open(); Console.WriteLine("established connection"); string query = @"SELECT a.idfaturamento, a.id_capa, a.pagamentodata, a.mensal, b.id_status FROM capas_faturamentos AS a INNER JOIN capas AS b ON a.id_capa = b.id_capa WHERE b.id_status = 4 AND a.mensal = 1 AND Month(a.pagamentodata) != Month(Getdate()) "; using SqlCommand cmd1 = new SqlCommand(query, cn); using SqlDataReader r = cmd1.ExecuteReader(); while (r.Read()) { int idFaturamento = r.GetInt32(0); int id_Capa = r.GetInt32(1); DateTime pagamentoData = r.GetDateTime(2); Console.WriteLine("ID FATURAMENTO: {0}\t ID CAPA:{1}\t DATA:{2}\t", idFaturamento, id_Capa, pagamentoData); // 把每条数据存入列表 dataList.Add((id_Capa, pagamentoData)); } } Console.WriteLine("___________________"); if (dataList.Any()) { // 第二步:批量插入所有数据 using SqlConnection cn = new SqlConnection(cs); cn.Open(); // 预定义带参数的插入语句,不要拼接字符串 string insertQuery = @" INSERT INTO capas_faturamentos ( -- 替换为实际字段名 id_capa, campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8, campo9, campo10, campo11, campo12, campo13, campo14, campo15, campo16, campo17, campo18, mensal ) VALUES (@IdCapa, @Pagamento, @Pagamento, @Pagamento, @Pagamento, @Pagamento, @Pagamento, '0','0','0','0','0','0', NULL, NULL, NULL, NULL, NULL, NULL, '1')"; int totalInserted = 0; foreach (var item in dataList) { using SqlCommand cmd = new SqlCommand(insertQuery, cn); // 添加参数,自动处理类型转换和转义 cmd.Parameters.AddWithValue("@IdCapa", item.IdCapa); cmd.Parameters.AddWithValue("@Pagamento", item.PagamentoData); totalInserted += cmd.ExecuteNonQuery(); } Console.WriteLine($"{totalInserted} 条记录已插入capas_faturamentos表"); } }
内容的提问来源于stack exchange,提问作者Patrick Juan
相关产品推荐
相关产品推荐

