2017-09-04 85 views
-2

我有一段代碼向數據庫發送一些信息,這些信息是我在將代碼運行到數據庫時編寫的,現在我需要檢查數據我插入數據庫已經存在,如果是的話,我必須更新它。我會在下面留下我的代碼,這樣我可以更容易地爲您提供幫助。如果你需要更多的代碼,隨時問我會提供給你。檢查某些數據是否已經是數據庫,如果有,更新數據

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

回答

0

您還沒有發佈你的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

我更新了這個問題。 –

相關問題