我想将两个文本框值与数据库中的两个相应列进行比较,然后如果条目是唯一的则执行保存操作
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();
}
有几种方法可以对其进行微调
不接触数据库
- 将查询更新为 select 仅 1 列而不是 *。 * select所有不需要检查记录是否存在的列。
string query = "Select [Animal ID] from ExpData where 'Animal ID' = '" +
textBox5.Text.Trim() + "' and Step = '" + comboBox2.Text.Trim() + "'";
- 您还可以使用 return 布尔值
的 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 列的值。
随着数据库的变化
- 在 table ExpData 上添加唯一键约束。唯一键应包含 Animal ID 和 Step 两列。
- 现在在代码中你可以有一个 try catch 块。如果没有重复记录则插入成功。但如果记录重复则出现异常。
- 在 try 块中保存到数据库代码
- 在 catch 块中检查异常类型和 ErroCode 以查看插入是否因唯一键而失败。检查此线程,
我推荐的方法
- 在两列上添加唯一键约束
- 创建一个存储过程
- 将整个插入数据作为输入
- 检查记录是否存在然后return -1
= 如果不存在记录则插入新数据和 return 新记录的 ID。
- 在代码中,您可以只检查 return 值。如果该值为非负值,则插入成功,否则向用户显示消息。
如果可以换数据库,那么在没有重复数据的情况下,就可以减少一次数据库调用。
P.S。您还可以使用 entity framework 等对象-关系映射框架来使其更容易,但这是一个很大的变化。
我有一个程序可以从文本框向数据库添加值。
我需要提供一种方法,如果添加的值不是唯一的,它应该 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();
}
有几种方法可以对其进行微调
不接触数据库
- 将查询更新为 select 仅 1 列而不是 *。 * select所有不需要检查记录是否存在的列。
string query = "Select [Animal ID] from ExpData where 'Animal ID' = '" + textBox5.Text.Trim() + "' and Step = '" + comboBox2.Text.Trim() + "'";
- 您还可以使用 return 布尔值 的 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 列的值。
随着数据库的变化
- 在 table ExpData 上添加唯一键约束。唯一键应包含 Animal ID 和 Step 两列。
- 现在在代码中你可以有一个 try catch 块。如果没有重复记录则插入成功。但如果记录重复则出现异常。
- 在 try 块中保存到数据库代码
- 在 catch 块中检查异常类型和 ErroCode 以查看插入是否因唯一键而失败。检查此线程,
我推荐的方法
- 在两列上添加唯一键约束
- 创建一个存储过程
- 将整个插入数据作为输入
- 检查记录是否存在然后return -1 = 如果不存在记录则插入新数据和 return 新记录的 ID。
- 在代码中,您可以只检查 return 值。如果该值为非负值,则插入成功,否则向用户显示消息。
如果可以换数据库,那么在没有重复数据的情况下,就可以减少一次数据库调用。
P.S。您还可以使用 entity framework 等对象-关系映射框架来使其更容易,但这是一个很大的变化。