fsk33 2024-11-22 00:11 采纳率: 73.5%
浏览 56
已结题

C#添加、更新MYSQL数据库问题

将接收到的信息写入数据库的两个表pacs_images和dengji表中,逻辑是:当pacs_images表满足"select count() from pacs_images where StudyUID='"+studyUid+"' and DicomName='"+DicomName2+"'"为0个,且dengji表满足"select count() from dengji where 检查UID='"+studyUid+"'"为0个时,执行两个表的添加操作。当dengji表的上述条件结果不为0,但pacs_images表的上述条件结果为0时,执行pacs_images表的添加操作,dengji表的更新操作。其它情况,做dengji表的更新操作。按以下程序执行下来,好像只能执行到第一个条件(if后面的),elseif和else后面的代码不能执行,而且在执行if块的两个表的添加操作时报错数据库错误:引发的异常:“MySql.Data.MySqlClient.MySqlException”(位于 mscorlib.dll 中)
数据库异常: Duplicate entry '1.2.156.112605.13' for key '检查UID'
注:'检查UID'字段是dengji表中唯一值,我将唯一值取消后,dengji表中出现很多相同条目,肯定不行。
查找原因一周了,无解。

string commandText = "select count(*) from dengji where 检查UID='"+studyUid+"'";
                    MySqlCommand mYSqlCommand = new MySqlCommand(commandText,conn);
                    //返回object类型第一行第一列
                    object obj=mYSqlCommand.ExecuteScalar();
                    //查询本读数据库pacs_images表
                    string commandText2 = "select count(*) from pacs_images where StudyUID='"+studyUid+"' and DicomName='"+DicomName2+"'";
                    //查无此数据
                    MySqlCommand mYSqlCommand2 = new MySqlCommand(commandText2, conn);
                    object obj2 = mYSqlCommand2.ExecuteScalar();
                    //表pacs_study和pacs_images都无数据
                    try
                    {
                        int value1 = int.Parse(obj.ToString());
                        int value2 = int.Parse(obj2.ToString());

                        // 如果 value1 等于 0 并且 value2 等于 0
                        if (value1 == 0 && value2 == 0)
                        {
                            // 插入到 pacs_images 表
                            string commandText3 = "INSERT INTO pacs_images(StudyUID, DicomName) VALUES(@studyUid, @DicomName2)";
                            using (MySqlCommand mYSqlCommand3 = new MySqlCommand(commandText3, conn))
                            {
                                mYSqlCommand3.Parameters.AddWithValue("@studyUid", studyUid);
                                mYSqlCommand3.Parameters.AddWithValue("@DicomName2", DicomName2);
                                mYSqlCommand3.ExecuteScalar(); // 使用 ExecuteNonQuery 而不是 ExecuteScalar
                            }

                            // 插入到 dengji 表
                            string commandText4 = "INSERT INTO dengji(检查UID,部位,诊断意见2,照片号,姓名,性别,年龄,检查时间,检查日期,shebei,DicomCount, 图像路径, Status, 接收时间) VALUES(@studyUid, @StudyDescription, @InstitutionName,@patID,@patName,@patSex,@patAge,@studyDateTime,@StudyDate,@dicomModality,'1', @dicomLoad1, '1', @currentTime)";
                            using (MySqlCommand mYSqlCommand4 = new MySqlCommand(commandText4, conn))
                            {
                                mYSqlCommand4.Parameters.AddWithValue("@studyUid", studyUid);
                                mYSqlCommand4.Parameters.AddWithValue("@StudyDescription", patientInfo.StudyDescription);
                                mYSqlCommand4.Parameters.AddWithValue("@InstitutionName", patientInfo.InstitutionName);
                                mYSqlCommand4.Parameters.AddWithValue("@patID", patientInfo.patID);
                                mYSqlCommand4.Parameters.AddWithValue("@patName", patientInfo.patName);
                                mYSqlCommand4.Parameters.AddWithValue("@patSex", patientInfo.patSex);
                                mYSqlCommand4.Parameters.AddWithValue("@patAge", patientInfo.patAge);
                                mYSqlCommand4.Parameters.AddWithValue("@studyDateTime", patientInfo.studyDateTime);
                                mYSqlCommand4.Parameters.AddWithValue("@StudyDate", patientInfo.StudyDate);
                                mYSqlCommand4.Parameters.AddWithValue("@dicomModality", dicomModality);
                                mYSqlCommand4.Parameters.AddWithValue("@dicomLoad1", dicomLoad1);
                                mYSqlCommand4.Parameters.AddWithValue("@currentTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                                mYSqlCommand4.ExecuteNonQuery();
                                
                            }
                            // 等待(如果需要)
                            System.Threading.Thread.Sleep(10);

                        }
                        // 如果 value1 不等于 0,但是 value2 等于 0
                        else if (value2 == 0)
                        {
                            // 插入到 pacs_images 表
                            string commandText3 = "INSERT INTO pacs_images(StudyUID, DicomName) VALUES(@studyUid, @DicomName2)";
                            using (MySqlCommand mYSqlCommand3 = new MySqlCommand(commandText3, conn))
                            {
                                mYSqlCommand3.Parameters.AddWithValue("@studyUid", studyUid);
                                mYSqlCommand3.Parameters.AddWithValue("@DicomName2", DicomName2);
                                mYSqlCommand3.ExecuteScalar(); // 使用 ExecuteNonQuery
                            }

                            // 更新 dengji 表
                            string commandText4 = "UPDATE dengji SET DicomCount = DicomCount + 1, 图像路径 = @dicomLoad1, 接收时间 = @currentTime, Status = '2' WHERE 检查UID = @studyUid";
                            using (MySqlCommand mYSqlCommand4 = new MySqlCommand(commandText4, conn))
                            {
                                mYSqlCommand4.Parameters.AddWithValue("@studyUid", studyUid);
                                mYSqlCommand4.Parameters.AddWithValue("@dicomLoad1", dicomLoad1);
                                mYSqlCommand4.Parameters.AddWithValue("@currentTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                                mYSqlCommand4.ExecuteNonQuery();
                            }
                        }
                        // 如果两个条件都不满足(即 value1 != 0 && value2 != 0)
                        else
                        {
                            // 更新 dengji 表
                            string commandText4 = "UPDATE dengji SET 图像路径 = @dicomLoad1, 接收时间 = @currentTime, Status = '' WHERE 检查UID = @studyUid";
                            using (MySqlCommand mYSqlCommand4 = new MySqlCommand(commandText4, conn))
                            {
                                mYSqlCommand4.Parameters.AddWithValue("@studyUid", studyUid);
                                mYSqlCommand4.Parameters.AddWithValue("@dicomLoad1", dicomLoad1);
                                mYSqlCommand4.Parameters.AddWithValue("@currentTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                                mYSqlCommand4.ExecuteNonQuery();
                            }
                        }
}

  • 写回答

26条回答 默认 最新

  • 趣享先生 优质创作者: 编程框架技术领域 2024-11-22 14:30
    关注

    该回答参考ChatGPT,由吾为汝整理提供如若有用,还请题主采纳!

    你的代码片段展示了如何在C#中使用MySQL进行数据操作,包括查询、插入和更新。以下是对代码的一些分析和建议,以提高其可读性和安全性:

    代码分析

    1. SQL注入风险

      • 直接将用户输入的 studyUidDicomName2 拼接到SQL语句中,存在SQL注入的风险。虽然你在后面的代码中使用了参数化查询,但在最开始的查询中仍然存在风险。建议统一使用参数化查询。
    2. **使用 ExecuteNonQuery**:

      • 在插入和更新操作中,使用 ExecuteScalar() 是不合适的,因为它用于返回单个值。应使用 ExecuteNonQuery() 来执行插入和更新操作。
    3. 异常处理

      • 代码中没有对数据库操作进行异常处理。建议使用 try-catch 块来捕获可能的异常,并进行相应的处理。
    4. 代码重复

      • 插入和更新操作的代码有重复,可以考虑将其封装成方法,以提高代码的可维护性。
    5. 时间格式化

      • 在插入时间时,使用 DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 可能会导致格式问题。可以直接使用 DateTime 类型作为参数,MySQL会自动处理。

    改进后的代码示例

    try
    {
        // 查询dengji表
        string commandText = "SELECT COUNT(*) FROM dengji WHERE 检查UID = @studyUid";
        using (MySqlCommand mYSqlCommand = new MySqlCommand(commandText, conn))
        {
            mYSqlCommand.Parameters.AddWithValue("@studyUid", studyUid);
            object obj = mYSqlCommand.ExecuteScalar();
            int value1 = Convert.ToInt32(obj);
            
            // 查询pacs_images表
            string commandText2 = "SELECT COUNT(*) FROM pacs_images WHERE StudyUID = @studyUid AND DicomName = @DicomName2";
            using (MySqlCommand mYSqlCommand2 = new MySqlCommand(commandText2, conn))
            {
                mYSqlCommand2.Parameters.AddWithValue("@studyUid", studyUid);
                mYSqlCommand2.Parameters.AddWithValue("@DicomName2", DicomName2);
                object obj2 = mYSqlCommand2.ExecuteScalar();
                int value2 = Convert.ToInt32(obj2);
    
                // 根据查询结果进行插入或更新
                if (value1 == 0 && value2 == 0)
                {
                    InsertPacsImages(conn, studyUid, DicomName2);
                    InsertDengji(conn, patientInfo, dicomLoad1, studyUid);
                }
                else if (value2 == 0)
                {
                    InsertPacsImages(conn, studyUid, DicomName2);
                    UpdateDengjiForNewImage(conn, studyUid, dicomLoad1);
                }
                else
                {
                    UpdateDengjiForExistingImage(conn, studyUid, dicomLoad1);
                }
            }
        }
    }
    catch (Exception ex)
    {
        // 处理异常
        Console.WriteLine("发生错误: " + ex.Message);
    }
    
    void InsertPacsImages(MySqlConnection conn, string studyUid, string dicomName)
    {
        string commandText = "INSERT INTO pacs_images(StudyUID, DicomName) VALUES(@studyUid, @DicomName)";
        using (MySqlCommand cmd = new MySqlCommand(commandText, conn))
        {
            cmd.Parameters.AddWithValue("@studyUid", studyUid);
            cmd.Parameters.AddWithValue("@DicomName", dicomName);
            cmd.ExecuteNonQuery();
        }
    }
    
    void InsertDengji(MySqlConnection conn, PatientInfo patientInfo, string dicomLoad1, string studyUid)
    {
        string commandText = "INSERT INTO dengji(检查UID,部位,诊断意见2,照片号,姓名,性别,年龄,检查时间,检查日期,shebei,DicomCount, 图像路径, Status, 接收时间) VALUES(@studyUid, @StudyDescription, @InstitutionName, @patID, @patName, @patSex, @patAge, @studyDateTime, @StudyDate, @dicomModality, '1', @dicomLoad1, '1', @currentTime)";
        using (MySqlCommand cmd = new MySqlCommand(commandText, conn))
        {
            cmd.Parameters.AddWithValue("@studyUid", studyUid);
            cmd.Parameters.AddWithValue("@StudyDescription", patientInfo.StudyDescription);
            cmd.Parameters.AddWithValue("@InstitutionName", patientInfo.InstitutionName);
            cmd.Parameters.AddWithValue("@patID", patientInfo.patID);
            cmd.Parameters.AddWithValue("@patName", patientInfo.patName);
            cmd.Parameters.AddWithValue("@patSex", patientInfo.patSex);
            cmd.Parameters.AddWithValue("@patAge", patientInfo.patAge);
            cmd.Parameters.AddWithValue("@studyDateTime", patientInfo.studyDateTime);
            cmd.Parameters.AddWithValue("@StudyDate", patientInfo.StudyDate);
            cmd.Parameters.AddWithValue("@dicomModality", dicomModality);
            cmd.Parameters.AddWithValue("@dicomLoad1", dicomLoad1);
            cmd.Parameters.AddWithValue("@currentTime", DateTime.Now);
            cmd.ExecuteNonQuery();
        }
    }
    
    void UpdateDengjiForNewImage(MySqlConnection conn, string studyUid, string dicomLoad1)
    {
        string commandText = "UPDATE dengji SET DicomCount = DicomCount + 1, 图像路径 = @dicomLoad1, 接收时间 = @currentTime, Status = '2' WHERE 检查UID = @studyUid";
        using (MySqlCommand cmd = new MySqlCommand(commandText, conn))
        {
            cmd.Parameters.AddWithValue("@studyUid", studyUid);
            cmd.Parameters.AddWithValue("@dicomLoad1", dicomLoad1);
            cmd.Parameters.AddWithValue("@currentTime", DateTime.Now);
            cmd.ExecuteNonQuery();
        }
    }
    
    void UpdateDengjiForExistingImage(MySqlConnection conn, string studyUid, string dicomLoad1)
    {
        string commandText = "UPDATE dengji SET 图像路径 = @dicomLoad1, 接收时间 = @currentTime, Status = '' WHERE 检查UID = @studyUid";
        using (MySqlCommand cmd = new MySqlCommand(commandText, conn))
        {
            cmd.Parameters.AddWithValue("@studyUid", studyUid);
            cmd.Parameters.AddWithValue("@dicomLoad1", dicomLoad1);
            cmd.Parameters.AddWithValue("@currentTime", DateTime.Now);
            cmd.ExecuteNonQuery();
        }
    }
    

    总结

    通过以上改进,代码的安全性、可读性和可维护性都有所提升。确保使用参数化查询来防止SQL注入,并处理可能的异常,以提高代码的健壮性。如果有其他具体问题或需求,欢迎继续讨论!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月22日
  • 已采纳回答 11月22日
  • 创建了问题 11月22日