我想将两个文本框值与数据库中的两个相应列进行比较,然后如果条目是唯一的则执行保存操作

I want to compare two textbox values to two corresponding columns in a database and then execute save action if the entry is unique

我有一个程序可以从文本框向数据库添加值。

我需要提供一种方法,如果添加的值不是唯一的,它应该 return 一条错误消息。但是我当前的代码无法做到这一点。即使这个值不唯一,也是在数据库中保存数据。

下面是我的代码。

try
        {
            if (runningExperimentToolStripMenuItem.Enabled == true && newExperimentToolStripMenuItem.Enabled == true)
            {
                MessageBox.Show("Select experiment type (under menu item 'File') first, Running or New.", "Experiment Type Required", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                if (sqlconf2.State == ConnectionState.Closed)
                sqlconf2.Open();
                //after connection is open, using following "if" code to check uniqueness of Step
                string query = "Select * from ExpData where 'Animal ID' = '" + textBox5.Text.Trim() + "' and Step = '" + comboBox2.Text.Trim() + "'";
                SqlDataAdapter sda = new SqlDataAdapter(query, sqlconf2);
                DataTable dtbl = new DataTable();
                sda.Fill(dtbl);
                if (dtbl.Rows.Count > 0)
                {
                    MessageBox.Show("This step has already been executed for the chosen animal ID. Please recheck. \n'Step' requires a numeric value from the drop down list. ", "Step Already Executed.", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation);
                }
                else
                {//code to add data into database
                    }
                }
                
                sqlconf2.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error Message");
            MessageBox.Show("If problem persists, check trouble shooting options in user manual or on our website.", "Trouble Shooting.", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        finally
        {
            datadisplay();
        }

有几种方法可以对其进行微调

不接触数据库

  1. 将查询更新为 select 仅 1 列而不是 *。 * select所有不需要检查记录是否存在的列。

string query = "Select [Animal ID] from ExpData where 'Animal ID' = '" + textBox5.Text.Trim() + "' and Step = '" + comboBox2.Text.Trim() + "'";

  1. 您还可以使用 return 布尔值
  2. 的 Exists 方法

string query = "Select Exists(Select [Animal ID] from ExpData where 'Animal ID' = '" + textBox5.Text.Trim() + "' and Step = '" + comboBox2.Text.Trim() + "')";

如果我们更改脚本,那么您可以使用 sqlcommand.ExecuteScalar 函数来获取 select 语句中 included/boolean 列的值。

随着数据库的变化

  1. 在 table ExpData 上添加唯一键约束。唯一键应包含 Animal ID 和 Step 两列。
  2. 现在在代码中你可以有一个 try catch 块。如果没有重复记录则插入成功。但如果记录重复则出现异常。
  3. 在 try 块中保存到数据库代码
  4. 在 catch 块中检查异常类型和 ErroCode 以查看插入是否因唯一键而失败。检查此线程,

我推荐的方法

  1. 在两列上添加唯一键约束
  2. 创建一个存储过程
    • 将整个插入数据作为输入
    • 检查记录是否存在然后return -1 = 如果不存在记录则插入新数据和 return 新记录的 ID。
  3. 在代码中,您可以只检查 return 值。如果该值为非负值,则插入成功,否则向用户显示消息。

如果可以换数据库,那么在没有重复数据的情况下,就可以减少一次数据库调用。

P.S。您还可以使用 entity framework 等对象-关系映射框架来使其更容易,但这是一个很大的变化。