检查某些数据是否已经是数据库,如果有,更新数据

问题描述:

我有一段代码向数据库发送一些信息,这些信息是我在将代码运行到数据库时编写的,现在我需要检查数据我插入数据库已经存在,如果是的话,我必须更新它。我会在下面留下我的代码,这样我可以更容易地为您提供帮助。如果你需要更多的代码,随时问我会提供给你。检查某些数据是否已经是数据库,如果有,更新数据

try 
{ 
conn.Open(); 
string sqlQuerry = @"INSERT INTO UXMenu(TransDocument, TransSerial, TransDocNumber, PartyName, PartyLocalityID, TotalAmount, ShipToPostalCode, Estado , IDZona ,Bonus,NumFac) VALUES (@transdocument, @transserial, @transdocnumber, @partyname, @partylocal, @totalamount, @shiptocode, @estado ,@IDZona ,@Bonus,@NumFac)"; 
SqlCommand SQLcm = new SqlCommand(); 
SQLcm.Connection = conn; 
SQLcm.CommandText = sqlQuerry; 
SQLcm.CommandType = CommandType.Text; 
SQLcm.Parameters.AddWithValue("@transdocument", transdocument); 
SQLcm.Parameters.AddWithValue("@transserial", transserial); 
SQLcm.Parameters.AddWithValue("@transdocnumber", transaction.TransDocNumber); 
SQLcm.Parameters.AddWithValue("@partyname", nomecli); 
SQLcm.Parameters.AddWithValue("@partylocal", locality); 
SQLcm.Parameters.AddWithValue("@totalamount", transaction.TotalAmount); 
SQLcm.Parameters.AddWithValue("@shiptocode", shipto); 
SQLcm.Parameters.AddWithValue("@estado", estado); 
SQLcm.Parameters.AddWithValue("@IDZona", "0"); 
SQLcm.Parameters.AddWithValue("@Bonus", "0"); 
SQLcm.Parameters.AddWithValue("@NumFac", "0"); 
SQLcm.ExecuteNonQuery(); 
MessageBox.Show("inseriu dados"); 
conn.Close(); 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 
} 

更新1:

这是我如何创建表:

using (SqlConnection conn = new SqlConnection(ConecçãoDB)) 
{ 
    conn.Open(); 
    SqlCommand command = new SqlCommand("IF OBJECT_ID('UXMenu', 'U') IS NULL CREATE TABLE UXMenu(TransDocument varchar(5), TransSerial varchar(5), TransDocNumber float PRIMARY KEY, PartyName varchar(60), PartyLocalityID varchar(5), TotalAmount varchar(25), ShipToPostalCode varchar(35), Estado int, IDZona varchar(15),Bonus varchar(15),NumFac varchar(15));", conn); 
    command.ExecuteNonQuery(); 
    MessageBox.Show("tabela criada menu"); 
    conn.Close(); 
+1

就个人而言,我找到一个很好的解决方案中使用存储过程,你查一键行是否存在,并执行'UPDATE'或'INSERT '根据它。 –

+0

个人而言,我喜欢改变历史。所以我会添加一个时间戳并且只用实际的时间戳插入。选择时,筛选每个条目的最新时间戳(或相应地创建视图)。这使得一个简单的“撤消”和“谁改变了什么时间”。 – Fildor

+0

就我个人而言,我会编写'AddOrUpdate'方法,其中包含使用主键进行复杂检查,以检查* local *数据库是否已经拥有该项并插入或更新。 – Sinatr

您还没有发布你的DB模式&样本数据,所以我不能给你查询执行。

但是,您想要执行的操作可以通过MERGE语句在SQL Server中实现。

这是在SQL Server 2008中添加的,以适应UPSERT陈述,这些陈述也很常见,但没有语言支持&必须分两步执行。

MERGE可以根据与源表的连接结果在目标表中实现UPDATEINSERTDELETE

的文档可以在https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

发现这里是你的表架构一个基本的例子。

运行两次。第一次运行会做一个INSERT,第二轮将做UPDATE

IF OBJECT_ID('UXMenu', 'U') IS NULL CREATE TABLE UXMenu(TransDocument varchar(5), TransSerial varchar(5), TransDocNumber float PRIMARY KEY, PartyName varchar(60), PartyLocalityID varchar(5), TotalAmount varchar(25), ShipToPostalCode varchar(35), Estado int, IDZona varchar(15),Bonus varchar(15),NumFac varchar(15)); 

DECLARE @TargetTransDocNumber float=1; 

SELECT * FROM UXMenu; 

MERGE UXMenu AS target 
USING 
(
    SELECT @TargetTransDocNumber as TransDocNumber 
) AS source 
ON (target.TransDocNumber = source.TransDocNumber) 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT(TransDocument, TransSerial, TransDocNumber, PartyName, PartyLocalityID, TotalAmount, ShipToPostalCode, Estado, IDZona, Bonus, NumFac) 
    VALUES('doc1', 'ser1', @TargetTransDocNumber, 'par1', 'ploc1', 'totamt1', 'postal1', 1, 'zon1', 'bon1', 'fac1') 
WHEN MATCHED THEN 
    UPDATE SET 
     target.TransDocument = 'doc2', 
     target.TransSerial='ser2', 
     target.PartyName='par2', 
     target.PartyLocalityID='ploc2', 
     target.TotalAmount='totamt2', 
     target.ShipToPostalCode='postal2', 
     target.Estado=2, 
     target.IDZona='zon2', 
     target.Bonus='bon2', 
     target.NumFac='fac2'; 

SELECT * FROM UXMenu; 
+0

我更新了这个问题。 –