我有一系列需要写入SQL的数据,我该如何检查SQL中的数据以防止相同的数据插入到表中?
要插入的示例数据:
David
James
John
如果第四个数据再次为John
,我希望系统跳过重复记录(John)。
到目前为止,我有:
SqlConnection myCnn = new SqlConnection(cnn);
String _state = "Insert into CamNo1(platename, date, camID, path, filename) OUTPUT INSERTED.platename values(@msg, getdate(), @camID, @path, @filename)";
SqlCommand _Query = new SqlCommand(_state, myCnn);
_Query.Parameters.AddWithValue("@msg", msg);
_Query.Parameters.AddWithValue("@camID", camID);
_Query.Parameters.AddWithValue("@path", imageFile);
_Query.Parameters.AddWithValue("@filename", name);
try
{
myCnn.Open();
string checkname = (string)_Query.ExecuteScalar();
myCnn.Close();
getcheckname = checkname;
Console.WriteLine("OK");
}
catch (Exception)
{
}
我得到了最后插入的字符串值checkname,我应该检查数据?
答案 0 :(得分:6)
如果您不想要重复数据,则应考虑在数据库级别使用UNIQUE CONSTRAINT或UNIQUE INDEX
强制执行此操作SQL Server 2008还有一个MERGE语句,可用于检查匹配的记录。如果您想要更新现有记录,这可能会有所帮助。
答案 1 :(得分:5)
首先,您可以通过使用唯一索引或约束来防止表中发生重复。索引/约束可以使用以下建议协同工作。如果仅使用唯一索引而不是以下解决方案之一,则插入重复记录将引发错误,您需要在另一端处理该错误。
此外,我可能会通过存储过程插入数据,该存储过程检查该行是否已存在。为此,您可以使用 MERGE 语句,如此伪代码所示:
create procedure MyProcedure
(
@Name nvarchar(100),
...
)
as
merge MyTable
using
(
select @Name,...
) as source (Name, ...)
on MyTable.Name = source.Name
when not matched then
insert (Name,...) values (source.Name,...)
when matched then
update set Name = @Name,...
或者,您可以检查记录是否存在并手动插入或更新:
create procedure MyProcedure
(
@Name nvarchar(100),
...
)
as
if not exists (select * from MyTable where Name = @Name)
begin
insert into MyTable (Name,...) values (@Name,...)
end
else
begin
update MyTable
set ...
where Name = @Name
end
答案 2 :(得分:2)
如果您想阻止插入重复数据,可以在这些字段上使用unique index or unique constraint。
如果你想只运行一个硬插入语句,但如果存在一个值则不执行任何操作,这样的事情应该可行。我在我的本地数据库上测试了这个:
declare @subject as varchar(100);
set @subject = 'hello'
insert into Subjects ([name])
select @subject
where not exists (select 1 from Subjects where [name] = @Subject)
答案 3 :(得分:-1)
尝试这种简单的方法
{
DataSet ds = New DataSet();
SqlConnection myCnn = New SqlConnection(cnn);
myCnn.Open();
SqlCommand _Query = New SqlCommand("Select *FROM CamNo1 where platename='" + Console.ReadLine + "' ", myCnn);
SqlDataAdapter sda = New SqlDataAdapter(_Query);
sda.Fill(ds);
Int i = ds.Tables[0].Rows.Count;
If (i > 0) Then
{
MessageBox.Show("platename" + Console.WriteLine + "Already Exists ");
ds.Clear();
}
Else
{
SqlConnection myCnn = New SqlConnection(cnn);
String _state = "Insert into CamNo1(platename, date, camID, path, filename) OUTPUT INSERTED.platename values(@msg, getdate(), @camID, @path, @filename)";
SqlCommand _Query = New SqlCommand(_state, myCnn);
_Query.Parameters.AddWithValue("@msg", msg);
_Query.Parameters.AddWithValue("@camID", camID);
_Query.Parameters.AddWithValue("@path", i`enter code here`mageFile`);
_Query.Parameters.AddWithValue("@filename", Name);
Try
{
myCnn.Open();
String checkname = (String)_Query.ExecuteScalar();
myCnn.Close();
getcheckname = checkname;
Console.WriteLine("OK");
}
Catch (Exception)
{
}
}
}