c# - 在将列表框项目插入 MS Access 数据库之前检查它
问题描述
如何避免我的 MS Access 数据库中的重复数据?
如果 listbox1 中的项目已经存在于我的 MS Access 数据库中并且它存在,我如何检查它,然后继续下一个 listbox1 项目并检查该项目是否已经存在。
private void button1_Click(object sender, EventArgs e)
{
OleDbCommand cmd = new OleDbCommand("Insert into ASD (SerialNumber) values (@SerialNumber)", con);
var parameter3 = new OleDbParameter("@SerialNumber", OleDbType.LongVarChar);
parameter3.Value = textBox1.Text;
cmd.Parameters.Add(parameter3);
con.Open();
try
{
for (int a = 0; a < listBox1.Items.Count; a++)
{
OleDbDataAdapter da;
DataTable dt = new DataTable();
da = new OleDbDataAdapter("select * from ASD where SerialNumber = '"+listBox1.Text+"'", con);
da.Fill(dt);
if (dt.Rows.Count > 0)
{
MessageBox.Show( "Serial Number Already Inserted!");
con.Close();
}
else
{
for (int i = 0; i < listBox1.Items.Count; i++)
{
cmd.Parameters["@SerialNumber"].Value = listBox1.Items[i];
}
cmd.ExecuteNonQuery();
MessageBox.Show("Item Added");
}
}
con.Close();
}
catch (Exception x)
{
MessageBox.Show(x + "");
}
}
解决方案
一般来说,将数据库操作与业务逻辑和表示分开是一个好主意。一一处理问题。
要检查您的表中是否有项目,您有几个选项。
有故障的 SQL 端:在 SerialNumber 列上创建唯一索引。每当您尝试使用现有的 SerialNumber 值添加新记录时,插入都会失败并且您会收到一条错误消息。我不推荐这种方法。
带有查询的 SQL 端:如果此 SerialNumber 值已在表中,则在尝试插入新值之前对数据库运行查询。我不推荐这个,因为它会转化为大量的 SQL 查询。
代码端:使用单个 SQL 查询获取内存中 SerialNumber 值的完整列表。如果下一个值已经在列表中,请检查此列表。如果记录数不太高,我会这样做。
如果记录数很高,我会创建一个存储过程并使用完整的新记录列表调用它。如果可以,此 SP 将插入新记录,并将返回失败的记录。
推荐阅读
- java - 在 xpath 的第 n 个实例上捕获元素会减慢多次运行后的代码运行速度
- matplotlib-basemap - cartopy:NOAA APT 图像上的地图叠加层
- c++ - 在课堂组合中建立数据链接的最佳方式
- spring - Run and close child context from parent app
- awk - awk / gawk printf 可变格式字符串时,将零更改为破折号
- html - 日期选择器和时间选择器应该分开
- swift - 从 Swift 中的 Firebase 实时数据库获取当前服务器时间
- c# - 如何转换为传递给函数的类型?
- c# - 警告:源文档中没有元素匹配 '/configuration/connectionStrings/add[@name='MyDB']'
- javascript - Angular - 如何访问注释类方法