iT邦幫忙

0

C# 在insert資料時,若資料存在,如何取得相關錯誤訊息? 則可以判斷是否update此筆資料?

各位前輩好

我原本的SQL語法,如下:

string strSQL = " IF NOT EXISTS(SELECT test1 FROM test WHERE test1 = @test1)" +
                " BEGIN" +
                " INSERT INTO test()" +
                " VALUES()" +
                " END " +
                " ELSE " +
                " BEGIN" +
                " UPDATE test " +
                " SET " +
                " WHERE " +
                " END";

但發現我的資料來源,應該說是無key值,可能每個欄位都需比對是否有重複。然而,查看之前PB所寫的程式,有SQLCA.SQLCODE < 0 這個語法可以判斷是要執行insert還是update,查詢C#有SQLException在處理這部分,但不知道怎麼使用,可以教我嗎? 感激不盡!

#20180723後續
經過詢問資料來源提供者,此表的確沒有key值,若是需要key值,則需要提出申請,在Oracle的view上新增key值,所以我就先假定幾個欄位做key值,關於資料會重複的問題,暫時先不處理了,反正目前也還沒有程式會用到這個資料表,謝謝各位協助。

pcw iT邦研究生 3 級 ‧ 2018-06-27 18:47:09 檢舉
哪一種資料庫?mysql? sql server?
b7307024 iT邦新手 4 級 ‧ 2018-06-27 18:49:21 檢舉
sql server 2005
wwx iT邦好手 1 級 ‧ 2018-06-28 15:32:31 檢舉
既然用EXISTS為何不是下 SELECT * 而用 SELECT test1

2 個回答

2
Luke
iT邦新手 3 級 ‧ 2018-06-28 09:51:15
最佳解答

您可以先用 Update , UPDATE 結果 再決定INSERT

BEGIN
UPDATE test SET test1= N'????' WHERE test1 = @test1 ;
IF @@ROWCOUNT = 0  
BEGIN
    PRINT 'insert~'
END
END

@@ROWCOUNT ==> 保留來自前一個陳述式執行的 @@ROWCOUNT。

邏輯就是
UPDATE 0筆,表示***沒有***此資料,下一步INSERT
UPDATE 大於0筆,表示***有***此資料,下一步離開
不要說有UPDATE 小於 0筆,/images/emoticon/emoticon09.gif

b7307024 iT邦新手 4 級 ‧ 2018-07-02 17:10:34 檢舉

但是我WHERE條件值,不知道要用哪一個!! 謝謝!

Luke iT邦新手 3 級 ‧ 2018-07-03 10:29:01 檢舉

怎麼可能,您不知道??/images/emoticon/emoticon04.gif

您知道您要更新的資料是哪一筆吧,
那這一筆您怎樣找出來,就用找出來的條件,去下WHERE 條件值。

b7307024 iT邦新手 4 級 ‧ 2018-07-23 17:16:28 檢舉

TWLuke大,如我在頂樓最下面所提的,就暫時先不處理這個問題了,由於你建議的方法也不錯用,所以就選你為最佳解答囉,感謝協助。

2
小魚
iT邦高手 1 級 ‧ 2018-06-27 20:22:32

方法1,分兩次作,
第一次Select,C#判斷有沒有抓到資料,
有就Update,沒有就Insert,

方法2,
在 SQL Server 中可以這樣處理:

if not exists (select 1 from t where id = 1)
    insert into t(id, update_time) values(1, getdate())
else
    update t set update_time = getdate() where id = 1
看更多先前的回應...收起先前的回應...
b7307024 iT邦新手 4 級 ‧ 2018-06-28 08:43:36 檢舉

請問select 1 from t where id = 1 是代表什麼意思呢?

就等於 你的新增/修改條件 SELECT 1 FROM test WHERE test1 = @test1

b7307024 iT邦新手 4 級 ‧ 2018-06-28 09:14:17 檢舉

但現在的狀況是我的目標資料表沒有key值,若是我加入where條件值去判斷,會發生目標資料表沒有資料,程式卻跑update,導致該筆資料lost掉。

小魚 iT邦高手 1 級 ‧ 2018-06-28 12:01:11 檢舉

(select 1 from t where id = 1)
也可以換成很複雜的判斷方式,
只要這一段有抓到資料就跑Update,
沒有抓到資料就跑Insert

目標資料表沒有資料
應該是會跑Insert

b7307024 iT邦新手 4 級 ‧ 2018-06-28 12:04:31 檢舉

小魚大,我使用您的方法2,也先將資料表清空,但是跑完程式不會有任何資料新增。

小魚 iT邦高手 1 級 ‧ 2018-06-28 12:22:49 檢舉

你先把程式碼PO上來吧...

b7307024 iT邦新手 4 級 ‧ 2018-07-02 17:07:49 檢舉

抱歉小魚大,因我先去寫比較簡單明確有KEY值的程式,所以比較慢回覆您,我修改的T-SQL語法如下:

string strSQL = " IF NOT EXISTS(SELECT 1 FROM TEST WHERE ID = 1 )" +
				" BEGIN" +
				" INSERT INTO TEST()" +
				" SELECT 'INSERT' " +
				" END" +
				" ELSE " +
				" BEGIN" +
				" UPDATE TEST " +
				" SET DATECREATED = @DATECREATED,CREATEUSER = @CREATEUSER " +
				" WHERE ID = 1 " +
				" SELECT 'UPDATE' " +
				" END";
小魚 iT邦高手 1 級 ‧ 2018-07-02 21:00:00 檢舉

我很好奇,沒寫Insert什麼怎麼會有資料呢?

b7307024 iT邦新手 4 級 ‧ 2018-07-02 22:06:39 檢舉

這只是我改的語法架構而已,沒有PO出完整語法。重點是測試原本可以跑的語法,改成

IF NOT EXISTS(SELECT 1 FROM TEST WHERE ID = 1 )

能不能正常跑。

b7307024 iT邦新手 4 級 ‧ 2018-07-23 17:09:33 檢舉

回小魚大,我後來再次測試使用

IF NOT EXISTS(SELECT 1 FROM TEST WHERE test1 = @test1 )

是可以正常跑的,不過這還是沒解決我一開始的問題,但如我在頂樓最下面所提的,就暫時先不處理這個問題了,非常感謝您的協助。

我要發表回答

立即登入回答