You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:45:02