fsk33 2024-11-21 16:11 采纳率: 80.6%
浏览 41
已结题

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();
                            }
                        }
}

展开全部

  • 写回答

28条回答 默认 最新

  • 拾光师 2024-11-22 05:12
    关注

    你遇到的问题主要集中在以下几个方面:

    1. 数据库唯一键约束dengji 表中的 检查UID 字段是唯一值,插入重复值会导致 Duplicate entry 错误。
    2. SQL 执行方法:在插入和更新操作中,应使用 ExecuteNonQuery 而不是 ExecuteScalar
    3. 逻辑分支问题:确保逻辑分支正确执行,避免遗漏。

    下面是对你的代码进行的一些改进和修正:

    修正后的代码

    using System;
    using MySql.Data.MySqlClient;
    
    public class DatabaseOperations
    {
        public void InsertOrUpdateData(string studyUid, string DicomName2, PatientInfo patientInfo, string dicomModality, string dicomLoad1, MySqlConnection conn)
        {
            try
            {
                // 查询 dengji 表
                string commandText = "SELECT COUNT(*) FROM dengji WHERE 检查UID=@studyUid";
                MySqlCommand mYSqlCommand = new MySqlCommand(commandText, conn);
                mYSqlCommand.Parameters.AddWithValue("@studyUid", studyUid);
                object obj = mYSqlCommand.ExecuteScalar();
                int value1 = int.Parse(obj.ToString());
    
                // 查询 pacs_images 表
                string commandText2 = "SELECT COUNT(*) FROM pacs_images WHERE StudyUID=@studyUid AND DicomName=@DicomName2";
                MySqlCommand mYSqlCommand2 = new MySqlCommand(commandText2, conn);
                mYSqlCommand2.Parameters.AddWithValue("@studyUid", studyUid);
                mYSqlCommand2.Parameters.AddWithValue("@DicomName2", DicomName2);
                object obj2 = mYSqlCommand2.ExecuteScalar();
                int value2 = int.Parse(obj2.ToString());
    
                // 如果 dengji 表和 pacs_images 表都无数据
                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.ExecuteNonQuery();
                    }
    
                    // 插入到 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();
                    }
                }
                // 如果 dengji 表有数据,但 pacs_images 表无数据
                else 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.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();
                    }
                }
                // 如果两个表都有数据
                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();
                    }
                }
            }
            catch (MySqlException ex)
            {
                Console.WriteLine($"数据库异常: {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"引发的异常: {ex.Message}");
            }
        }
    }
    
    public class PatientInfo
    {
        public string StudyDescription { get; set; }
        public string InstitutionName { get; set; }
        public string patID { get; set; }
        public string patName { get; set; }
        public string patSex { get; set; }
        public string patAge { get; set; }
        public string studyDateTime { get; set; }
        public string StudyDate { get; set; }
    }
    

    关键点解释

    1. 参数化查询:使用 Parameters.AddWithValue 方法来避免 SQL 注入攻击。
    2. 异常处理:添加了 try-catch 块来捕获和处理异常。
    3. SQL 执行方法:在插入和更新操作中使用 ExecuteNonQuery 方法。
    4. 逻辑分支:确保逻辑分支正确执行,避免遗漏。

    其他建议

    1. 事务处理:为了确保数据的一致性,可以使用事务处理来包裹插入和更新操作。
    2. 日志记录:在关键步骤中添加日志记录,方便调试和排查问题。
    3. 性能优化:如果数据量较大,可以考虑使用批量插入和更新操作来提高性能。

    希望这些改进能帮助你解决遇到的问题。如果有任何进一步的问题或需要更多帮助,请随时告诉我。

    展开全部

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 四叉树的创建和输出问题
  • ¥15 使用okhttp分片上传文件,总是超时,到底是哪里的问题
  • ¥15 javaweb连接数据库,jsp文件加载不出来
  • ¥15 matlab关于高斯赛德尔迭代的应用编撰。(相关搜索:matlab代码|迭代法)
  • ¥15 pkg-types,vite,d
  • ¥15 损失匹配问题,求解答
  • ¥15 3500常用汉字书法体检测数据集下载
  • ¥15 odoo17在制造模块或采购模块良品与次品如何分流和在质检模块下如何开发
  • ¥15 Qt音乐播放器的音乐文件相对路径怎么写
  • ¥15 VB.NET利用摄像头拍照的程序
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部