台灣最大程式設計社群網站
線上人數
1028
 
會員總數:243152
討論主題:187974
歡迎您免費加入會員
討論區列表 >> C# >> T-SQL如何計算新增、修改筆數,並回傳給C#,去新增資料到另一資料表
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
T-SQL如何計算新增、修改筆數,並回傳給C#,去新增資料到另一資料表
價值 : 20 QP  點閱數:328 回應數:14

樓主

阿山
初學者
316 24
916 134
發送站內信

各位前輩好,新手小弟又來詢問問題了,如下:


搜尋相關Tags的文章: [ T-SQL ] , [ 筆數 ] ,
本篇文章發表於2018-06-21 14:24
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
不錯的參考

Bobby
檢舉此回應
在 INSERT 後面再加一條:



再將 cmd.ExecuteNonQuery(); 改用變數接著


後面應該會了
本篇文章回覆於2018-06-21 15:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

阿山
檢舉此回應
回Bobby大,T-SQL部分你是說改成這樣嗎?


然而,int ResultCnt = cmd.ExecuteNonQuery();
我測試了一下,只會返回1,查相關資料是說

If use ExecuteNonQuery to INSERT, UPDATE, DELETE, this method returns the Number of affected data row, but if fail, it returns 0.


還請再次協助喔!! 感謝~


本篇文章回覆於2018-06-21 16:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Bobby
檢舉此回應
改成這樣試試


本篇文章回覆於2018-06-21 16:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

阿山
檢舉此回應
回Bobby大,測試結果一樣只有得到1,我完整程式碼如下:


本篇文章回覆於2018-06-21 17:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

Bobby
檢舉此回應
確定資料不存在?
會不會是已存在了,所以一直在UPDATE ?

下面是我測試的Code,第一次會回傳2(INSERT),第二次會回傳1(UPDATE)
test table 只有一個 int column 叫 id

本篇文章回覆於2018-06-21 17:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

春天
檢舉此回應
我印像中ExecuteNonQuery回傳的是受影響的資料筆數吧...也就是樓主要的數據
ExecuteNonQuery
本篇文章回覆於2018-06-22 12:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

Bobby
檢舉此回應
是的

樓主的程式是利用迴圈一筆一筆資料
以T-SQL判斷要進行INSERT或是UPDATE
每一次的 executenonquery 都只會回傳 1 (一筆INSERT或是一筆UPDATE)

所以我才建議在 INSERT 後多做一次 INSERT temp table
讓受影響的資料筆數變成 2
這樣T-SQL在判斷要INSERT時,就會INSERT 2 筆資料(回傳2)
而判斷要UPDATE時,就只會UPDATE 1 筆資料 (回傳1)

樓主就可依 executenonquery 的回傳值判斷本次是進行 INSERT or UPDATE
本篇文章回覆於2018-06-22 12:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
不錯的參考

春天
檢舉此回應
萬一update到2筆呢,這是有可能發生的吧?

我建議是
執行作業前 SELECT COUNT(*) FROM TABLE取得執行前筆數
執行作業時 executenonquery = 異動筆數
執行作業後 SELECT COUNT(*) FROM TABLE取得執行後筆數
如此,新增筆數= 執行後筆數 - 執行前筆數,更新筆數 = 異動筆數 - 新增筆數

另外非常不建議用for迴圈一筆一筆跟資料庫做execute,也建議要有Rollback的機制
本篇文章回覆於2018-06-22 13:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

阿山
檢舉此回應
請問春天大,我目標資料表是有設定key值的
這樣子是不是就不會有update到2筆的問題呢?

因為小弟從以前寫程式的觀念就只有for迴圈一筆一筆做execute
還是請教您有何建議呢? 新手如我也會這個方法!
且您說的Rollback的機制該怎麼做呢?

謝謝!
本篇文章回覆於2018-06-22 15:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

春天
檢舉此回應
INSERT INTO temp這個方法不會比SELECT COUNT(*) FROM TABLE 來的好,效能、維護可讀性

RollbackSqlTransaction

以下示範動態加入變數及Rollback

本篇文章回覆於2018-06-22 16:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

阿山
檢舉此回應

INSERT INTO temp這個方法不會比SELECT COUNT(*) FROM TABLE 來的好,效能、維護可讀性


您指的是SELECT 1 AS CNT INTO #TMP; 這個語法嗎?

那您可以提供SELECT COUNT(*) FROM TABLE 與 INSERT、UPDATE 整合的T-SQL語法嗎??
謝謝!
本篇文章回覆於2018-06-22 17:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

春天
檢舉此回應
要整合什麼...SELECT 跟INSERT是分開做的吧
本篇文章回覆於2018-06-22 17:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

阿山
檢舉此回應
喔~ 抱歉,沒將您的回答看清楚!


執行作業前 SELECT COUNT(*) FROM TABLE取得執行前筆數
執行作業時 executenonquery = 異動筆數
執行作業後 SELECT COUNT(*) FROM TABLE取得執行後筆數
如此,新增筆數= 執行後筆數 - 執行前筆數,更新筆數 = 異動筆數 - 新增筆數


這部分我找時間試看看囉! 感謝解答~


本篇文章回覆於2018-06-22 17:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

阿山
檢舉此回應
回Bobby大,抱歉因蠻多方案可以參考,所以比較慢回復您。

確定資料不存在?
會不會是已存在了,所以一直在UPDATE ?

下面是我測試的Code,第一次會回傳2(INSERT),第二次會回傳1(UPDATE)
test table 只有一個 int column 叫 id


使用您的方法,我一開始使用更新Label的方式查看結果,可能是因為畫面更新太快,而一直看不到數值2(INSERT)。
後來改使用存成TXT檔後,在將資料刪除重做一遍就可以得到正確的結果了,感謝您的解答!


本篇文章回覆於2018-06-25 08:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.