我创建了一个.net控制台应用程序,它从计算机和/用户收集一些基本的库存信息。它通过存储过程将此信息转储到SQL Server 2012数据库中。
我偶尔会在至少两个表中出现重复记录。
存储过程非常简单,当存储过程收到序列号(以及其他参数)时,它会在资产表中搜索序列号。如果找到匹配项,则返回assetId
,否则将创建新条目并返回新创建的assetId
。同样在该过程中,使用先前返回的assetId
将日期时间条目添加到事件表中。
我开始看到的是资产表中的两条记录,其中包含连续的assetId
个数字,但具有相同的序列号。有趣的是,事件表中将有两条记录对应于具有完全相同assetId
的这些date_time
中的每一个。
在我们拥有的22,000多台计算机中,这只发生在五个序列号上,所以对我来说这不是世界末日。但是,由于这个问题,我对其他数据的可靠性提出了质疑。
任何想法如何发生?
存储过程
--Create an asset row if there is not one and retrieve the id. Or just retrieve the id.
If (select count(assetid) from asset where serial=@serial) > 0
Begin
set @assetid = (select top 1 assetid from asset where serial=@serial )
End
Else
--Add asset to table
Begin
Insert into asset (serial, model, manufacturer)
values (@serial, @model, @manufacturer);
set @assetid = (Select SCOPE_IDENTITY())
End
--End Asset entry
--Insert Audit Event record
Insert into auditevent (assetid, audittime, username, computername, operatingsystem)
values (@assetid, @audittime, @username, @computername, @operatingsystem)
Declare @auditeventid int = (select SCOPE_IDENTITY())
--Send the ipString to the function that will convert it to a table and insert into IP Table
Insert into ipaddress (auditeventid, ipaddress)
select *
from CsvToTable(@auditeventid, @ipaddressvalues)
控制台应用(单线程)
Dim strExcutionCommand As String = "dbo.auditclient @computername=N'" & strComputerName & "',@modeltext=N'" & strModel & "',@serial=N'" & strSerialNumber & "',@username=N'" & strUserName & "',@manufacturertext=N'" & strManufacturer & "',@operatingsystemtext=N'" & strOperatingSystem & "',@ipaddressvalues=N'" & strNetAddress & "'"
Dim Inv_ConnectString As String = "Data Source=cen-support01;Initial Catalog=IT_Inventory;User Id=" & strSqlUser & ";Password=" & strSqlPw & ";"
Dim myConnection As SqlConnection = New SqlConnection(Inv_ConnectString)
Dim myCommand As SqlCommand = New SqlCommand(strExcutionCommand, myConnection)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
答案 0 :(得分:0)
如果不查看控制台应用程序的代码以及运行方式的详细信息,就不容易诊断此问题。例如,您是否可以运行多个实例并且有2个线程同时尝试执行相同的任务?
当有要添加的库存项目并查看是否重复时,您可以通过运行控制台应用程序两次来测试这是否是原因。
存储过程的逻辑似乎很好,虽然我会稍微重写一下:
IF EXISTS (SELECT 1 FROM asset WHERE serial=@serial)
-- Create an asset row if it doesn't exist
BEGIN
SELECT @assetid = assetid FROM asset WHERE serial=@serial
END
ELSE
--Add asset to table
BEGIN
INSERT INTO asset (serial,model,manufacturer)
VALUES (@serial,@model,@manufacturer);
SELECT @assetid = SCOPE_IDENTITY()
END
这是未经测试的,但你应该明白这一点。