C# 如何避免数据库中存在重复数据?
我有一个数据库,用户可以跟踪进入商店的新模型,但他们只保留每个模型中的一个,我不知道如何阻止用户重复相同的模型。我已经在这个网站上看到了一些以前的答案,但是在我自己的网站上使用这些代码时,我发现了一些错误C# 如何避免数据库中存在重复数据?,c#,visual-studio,C#,Visual Studio,我有一个数据库,用户可以跟踪进入商店的新模型,但他们只保留每个模型中的一个,我不知道如何阻止用户重复相同的模型。我已经在这个网站上看到了一些以前的答案,但是在我自己的网站上使用这些代码时,我发现了一些错误 private void check_Click(object sender, EventArgs e) { string query = "INSERT INTO tbl_phones(model) VALUES(@model)";
private void check_Click(object sender, EventArgs e)
{
string query = "INSERT INTO tbl_phones(model) VALUES(@model)";
using (SqlConnection sqlconn = new SqlConnection(@""))
using (SqlCommand comm = new SqlCommand(query, sqlconn))
{
sqlconn.Open();
comm.Parameters.Add("@model, SqlDbType.NVarChar).Value = phoneinput.Text;
comm.ExecuteNonQuery();
这应该有效(获取输入型号的手机数量,如果少于1,则插入)
这里是你可以做很多事情的方法。您可以在表上设置约束,可以在插入前查询数据库,也可以在重复键上设置诸如insert\之类的内容。您应该发布错误并编写它抛出的代码,而不是问这么宽泛的问题。将其设置为主键,以便数据库对每种类型只允许一个值。欢迎!如果存在重复模型,您想做什么?忽略或抛出错误?messagebox可以让用户知道吗?感谢您的帮助,除了ExecuteScalar中的一个错误之外,代码似乎工作正常-是一个在给定上下文中无效的方法,知道这是什么意思吗?与其执行两个查询,不如运行一个调用的查询。合并将插入新记录或更新(如果需要)现有记录。是否复制了我的初始答案?我无意中包括了.ExecuteScalar()两次,现在我已经纠正了这一点。另外,我建议你在我的回答中使用另一种解决方案——主键可能是更好的方法。感谢你的贡献,是的,这就是错误所在。我已将你的解决方案标记为答案。我已经把ID列作为主键了,所以我假设如果我需要链接表,最好还是保持它不变?您所展示的方法之间的主要区别是什么?另外,如果我想弹出一个错误来通知我猜的人,我只是在结尾处添加了一个else语句?对于第一个答案,您只需添加一个else语句并执行您需要执行的操作。这两个选项之间的主要区别在于后者只需运行一个查询,而初始查询则需要运行两个查询,因此如果您能够使用主键(在本例中,您就是主键),我可能会推荐后者。
private void check_Click(object sender, EventArgs e)
{
string insertQuery = "INSERT INTO tbl_phones(model) VALUES(@model)";
string checkQuery = "SELECT COUNT(*) FROM tbl_phones WHERE model = @model";
using (SqlConnection sqlconn = new SqlConnection(@""))
{
sqlconn.Open();
SqlCommand checkCommand = new SqlCommand(checkQuery, sqlconn);
checkCommand.Parameters.AddWithValue("@model", phoneinput.Text);
if((int)checkCommand.ExecuteScalar() < 1)
{
SqlCommand insertCommand = new SqlCommand(insertQuery, sqlconn);
insertCommand.Parameters.AddWithValue("@model", phoneinput.Text);
insertCommand.ExecuteNonQuery();
}
}
}
private void check_Click(object sender, EventArgs e)
{
string insertQuery = "INSERT INTO tbl_phones(model) VALUES(@model)";
using (SqlConnection sqlconn = new SqlConnection(connectionString))
{
sqlconn.Open();
SqlCommand insertCommand = new SqlCommand(insertQuery, sqlconn);
insertCommand.Parameters.AddWithValue("@model", "test");
try
{
insertCommand.ExecuteNonQuery();
}
catch(SqlException ex)
{
if (ex.Number == 2627)
{
// Phone already exists, do some stuff
}
else throw;
}
}
}