峰峦@叠嶂 2024-06-06 13:40 采纳率: 99.5%
浏览 3
已结题

判断若重复,就自动跳过的语句;

请问一下,我的这段代码,是从ERP数据库内提取产品的入库数量,并保存到指定的另一个生产软件的数据表里面,以做报表用,我们是以“名称(proName)、批号(batchNo)、规格(spec)等这几项为判断依据,若是新数据就正常保存,若是重复数据,就直接跳过不保存,请问以下代码是否正确,敬请指导一下;

  private void btnK3_Click(object sender, EventArgs e)
        {
            try
            {
                using (SqlConnection conn = new SqlConnection("server=192.168.2.5;database=AIS20150211135927;user=sa;password=zzwr"))
                {
                    conn.Open();

                    SqlConnection conn1 = new SqlConnection("server=192.168.100.247;database=WHMesInfo;user=sa;password=whyy");

                    conn1.Open();

                    // 获取读取到的字段值
                    DateTime startdate = dateTimePicker1.Value.Date;
                    DateTime Enddate = dateTimePicker2.Value.Date;

                    string selectSql = @"select FName,FModel,FHeadSelfA0228,sum(Fauxqty) Fauxqty,sum(FEntrySelfA0242) FEntrySelfA0242 from
                                         (select t2.FDate,t4.FName,t4.FModel,t2.FHeadSelfA0228,t1.Fauxqty,t1.FEntrySelfA0242  
                                                              from ICStockBillEntry t1 
                                                              join ICStockBill t2 on t1.FInterID=t2.FInterID 
                                                              join t_ICItem t4 on t1.FItemID=t4.FItemID ----(产品表,包含产品名称、编码等信息)
                                                              join ICTransactionType t5 on t2.FTranType=t5.FID
                                                              join t_Stock t6 on t1.FDCStockID=t6.FItemID ---仓库信息
                                                              where t2.FTranType=2 --(产品入库单,不含外部入库等信息)
                                                              and (t6.FName='有效成品库'or t6.FName='辅料库')
                                                              and t2.FDate >= @startDate
                                                              and t2.FDate <= @endDate) as subquery                                                             
                                                              group by  FName,FModel,FHeadSelfA0228";
                       
                    using (SqlCommand selectCommand = new SqlCommand(selectSql, conn))
                    {
                        selectCommand.Parameters.AddWithValue("@startdate", startdate);
                        selectCommand.Parameters.AddWithValue("@Enddate", Enddate);

                        DataTable dataTable = new DataTable();
                        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(selectCommand))
                        {
                            dataAdapter.Fill(dataTable);
                        }
                       
                        // 遍历DataTable中的每一行,并插入到w_protran表中
                        foreach (DataRow row in dataTable.Rows)
                        {
                            // 将读取ERP数据,插入MES[w_k3tran]数据表之前,先检查是否存在重复记录;
                            string existingDataSql = @"SELECT COUNT(*) FROM [dbo].[w_k3tran] 
                               WHERE  [batchNo] = @batchNo 
                               AND [proname] = @proname 
                               AND [instock] = @instock 
                               AND [spec] = @spec 
                               AND [sample] = @sample";
                            using (SqlCommand checkCommand = new SqlCommand(existingDataSql, conn1))
                            {
                                //checkCommand.Parameters.AddWithValue("@date", row["FDate"]);
                                checkCommand.Parameters.AddWithValue("@batchNo", row["FHeadSelfA0228"]);
                                checkCommand.Parameters.AddWithValue("@proname", row["FName"]);
                                checkCommand.Parameters.AddWithValue("@spec", row["FModel"]);/
                                checkCommand.Parameters.AddWithValue("@instock", row["Fauxqty"]);
                                checkCommand.Parameters.AddWithValue("@sample", row["FEntrySelfA0242"]);

                                int count = Convert.ToInt32(checkCommand.ExecuteScalar());

                                if (count > 0)
                                {
                                    //MessageBox.Show("对不起!历史记录有重复,请检查确认!");
                                    
                                    continue;//20240603修改为,遇到重复自动跳过;
                                }
                            }

                            //插入到新数据表的对应字段值
                            string insertSql = @"INSERT INTO [dbo].[w_k3tran]([batchNo],[proname],[spec],[instock],[sample])
                                    VALUES ( @batchNo, @proname,@spec,@instock,@sample)";
                            using (SqlCommand insertCommand = new SqlCommand(insertSql, conn1))
                            {
                                //insertCommand.Parameters.AddWithValue("@date", row["FDate"]);
                                insertCommand.Parameters.AddWithValue("@batchNo", row["FHeadSelfA0228"]);
                                insertCommand.Parameters.AddWithValue("@proname", row["FName"]);
                                insertCommand.Parameters.AddWithValue("@spec", row["FModel"]);
                                insertCommand.Parameters.AddWithValue("@instock", row["Fauxqty"]);
                                //insertCommand.Parameters.AddWithValue("@outstock", row["outstock"]);
                                insertCommand.Parameters.AddWithValue("@sample", row["FEntrySelfA0242"]);

                                insertCommand.ExecuteNonQuery();
                            }
                        }

                        MessageBox.Show("插入成功");
                    }

                    conn.Close();
                    conn1.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }     
        }

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 13:40
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的C#代码中,您已经实现了从ERP系统获取数据并将其插入到生产软件数据表的功能,同时通过一个SQL查询来检查是否存在重复数据。整体逻辑看起来是正确的,但为了确保完全符合您的需求,我建议对一些细节进行微调。

    首先,在执行插入操作之前,可以优化检查重复数据的部分,以减少不必要的数据库交互。将existingDataSql查询改为只返回FHeadSelfA0228, FName, 和 FModel 这些用于唯一标识条目的列,然后在内存中检查这些数据是否已存在。这样可以减少对生产软件数据库的访问次数。

    以下是调整后的代码:

    // ... 其他代码保持不变
    
    using (SqlCommand checkCommand = new SqlCommand(existingDataSql, conn1))
    {
        checkCommand.Parameters.AddWithValue("@batchNo", row["FHeadSelfA0228"]);
        checkCommand.Parameters.AddWithValue("@proname", row["FName"]);
        checkCommand.Parameters.AddWithValue("@spec", row["FModel"]);//20240110增加金蝶里的规格行,同步MES数据表,也同步增加规格项目;
        
        // 增加存储结果的变量
        SqlDataReader reader = null;
        
        try
        {
            reader = checkCommand.ExecuteReader();
            
            while (reader.Read())
            {
                // 在这里添加一个集合,用于存储已存在的数据
                if (_uniqueIdentifiers.Contains(new Tuple<string, string, string>(reader.GetString(0), reader.GetString(1), reader.GetString(2))))
                {
                    // 如果找到重复的数据,跳出循环
                    break;
                }
                
                // 将当前数据添加到集合中,以便后续检查
                _uniqueIdentifiers.Add(new Tuple<string, string, string>(reader.GetString(0), reader.GetString(1), reader.GetString(2)));
            }
        }
        finally
        {
            if (reader != null)
            {
                reader.Close();
            }
        }
    
        if (_uniqueIdentifiers.Contains(new Tuple<string, string, string>(row["FHeadSelfA0228"].ToString(), row["FName"].ToString(), row["FModel"].ToString())))
        {
            // 当前行已在数据库中存在,跳过插入操作
            continue;
        }
    }
    
    // ... 插入操作和其他代码保持不变
    

    在这个版本中,我引入了一个名为 _uniqueIdentifiers 的集合,它用来存储已存在的唯一标识符(由 FHeadSelfA0228, FName, 和 FModel 组成)。在遍历查询结果时,如果发现当前行与集合中的一项匹配,那么就会立即跳出循环并跳过插入操作。

    此外,我还修复了在插入数据时未处理异常的情况,建议在 ExecuteNonQuery() 方法周围加上 try-catch 块。

    最后,确保在程序结束时关闭数据库连接。这可以通过使用 using 关键字来实现,或者在适当的地方显式关闭连接。

    这是整个更新后的代码片段:

    private void btnK3_Click(object sender, EventArgs e)
    {
        List<Tuple<string, string, string>> _uniqueIdentifiers = new List<Tuple<string, string, string>>();
    
        try
        {
            // ... 连接数据库的代码保持不变
    
            // ... 获取读取到的字段值的代码保持不变
    
            using (SqlCommand selectCommand = new SqlCommand(selectSql, conn))
            {
                // ... 执行SQL查询和填充DataTable的代码保持不变
    
                foreach (DataRow row in dataTable.Rows)
                {
                    // ... 检查重复数据和插入数据的代码已修改
    
                    // 插入到新数据表的对应字段值
                    string insertSql = @"INSERT INTO [dbo].[w_k3tran]([batchNo],[proname],[spec],[instock],[sample])
                                            VALUES ( @batchNo, @proname,@spec,@instock,@sample)";
    
                    using (SqlCommand insertCommand = new SqlCommand(insertSql, conn1))
                    {
                        try
                        {
                            // ... 设置参数的代码保持不变
    
                            insertCommand.ExecuteNonQuery();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"插入失败: {ex.Message}");
                        }
                    }
                }
    
                MessageBox.Show("插入成功");
            }
    
            conn.Close();
            conn1.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }     
    }
    

    这个修改后的代码应该能更有效地处理重复数据,并且在插入过程中遇到错误时提供更好的反馈。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 已采纳回答 6月27日
  • 修改了问题 6月6日
  • 创建了问题 6月6日

悬赏问题

  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术