检查某些数据是否已经是数据库,如果有,更新数据
问题描述:
我有一段代码向数据库发送一些信息,这些信息是我在将代码运行到数据库时编写的,现在我需要检查数据我插入数据库已经存在,如果是的话,我必须更新它。我会在下面留下我的代码,这样我可以更容易地为您提供帮助。如果你需要更多的代码,随时问我会提供给你。检查某些数据是否已经是数据库,如果有,更新数据
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();
答
您还没有发布你的DB模式&样本数据,所以我不能给你查询执行。
但是,您想要执行的操作可以通过MERGE
语句在SQL Server中实现。
这是在SQL Server 2008中添加的,以适应UPSERT
陈述,这些陈述也很常见,但没有语言支持&必须分两步执行。
MERGE
可以根据与源表的连接结果在目标表中实现UPDATE
,INSERT
或DELETE
。
的文档可以在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
我更新了这个问题。 –
就个人而言,我找到一个很好的解决方案中使用存储过程,你查一键行是否存在,并执行'UPDATE'或'INSERT '根据它。 –
个人而言,我喜欢改变历史。所以我会添加一个时间戳并且只用实际的时间戳插入。选择时,筛选每个条目的最新时间戳(或相应地创建视图)。这使得一个简单的“撤消”和“谁改变了什么时间”。 – Fildor
就我个人而言,我会编写'AddOrUpdate'方法,其中包含使用主键进行复杂检查,以检查* local *数据库是否已经拥有该项并插入或更新。 – Sinatr