台灣最大程式設計社群網站
線上人數
1580
 
會員總數:243325
討論主題:188102
歡迎您免費加入會員
討論區列表 >> MS SQL >> MS SQL可以過可是在VS .net出錯
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
MS SQL可以過可是在VS .net出錯
價值 : 50 QP  點閱數:358 回應數:6

樓主

林文捷
初學者
25 4
116 14
發送站內信

第一次發問,如有順序問題,煩請糾正

我想把資料庫的兩行資料互換資料,我在MS SQL的程式碼是寫這樣
DECLARE @t1 int
DECLARE @t2 int
SET @t1 = (SELECT
sortOrder
FROM table
WHERE ParentID = '0'
AND sortOrder = '2')
SET @t2 = (SELECT
sortOrder
FROM table
WHERE ParentID = '0'
AND sortOrder = '3')
UPDATE table
SET sortOrder = '99'
WHERE ParentID = '0'
AND sortOrder = '3'
UPDATE table
SET sortOrder = @t2
WHERE ParentID = '0'
AND sortOrder = '2'
UPDATE table
SET sortOrder = @t1
WHERE ParentID = '0'
AND sortOrder = '99'

也成功了,於是把這段放回去C#後端
執行後卻出現錯誤( sql 子查詢傳回不只 1 個值。這種狀況在子查詢之後有 =、 =、 、 =、 、 = 或是子查詢做為運算式使用時是不允許的。 )
我C#後端的程式碼是寫成這樣

SqlConnection cn = new SqlConnection(WebConfigurationManager.ConnectionStrings["TableConnectionString"].ConnectionString);
SqlCommand sqlcmd = cn.CreateCommand();
sqlcmd.CommandText = "DECLARE @t1 int DECLARE @t2 int set @t1 =(select sortOrder from table where ParentID = @ParentID and sortOrder = @old) set @t2 =(select sortOrder from table where ParentID = @ParentID and sortOrder = @new) UPDATE table SET sortOrder = '99' WHERE ParentID = @ParentID AND sortOrder = @new UPDATE table SET sortOrder = @t2 WHERE ParentID = @ParentID AND sortOrder = @old UPDATE table SET sortOrder = @t1 WHERE ParentID = @ParentID AND sortOrder = '99'";
cn.Open();
sqlcmd.Parameters.AddWithValue("@old", e.OldValues[5].ToString());
sqlcmd.Parameters.AddWithValue("@new", e.NewValues[5].ToString());
sqlcmd.Parameters.AddWithValue("@ParentID", e.NewValues[0].ToString());
sqlcmd.ExecuteNonQuery();
cn.Close();

偵錯後我大概知道是set @t1和set @t2 這兩個動作導致錯誤產生,但不明白為什麼

搜尋相關Tags的文章: [ C# ] , [ SQL ] , [ MS SQL ] ,
本篇文章發表於2018-09-21 15:33
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小魚
檢舉此回應
一個段落完了之後就要用;分隔,
系統才會知道要怎麼執行.
本篇文章回覆於2018-09-22 07:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

初階MIS
檢舉此回應
小魚大大,謝謝你的回覆
我有試著在每個段落後面加上";"
但還是顯示一樣的錯誤

改完後的sql搜尋如下

DECLARE @t1 int;
DECLARE @t2 int;
SET @t1 = (SELECT
sortOrder
FROM table
WHERE ParentID = '0'
AND sortOrder = '2');
SET @t2 = (SELECT
sortOrder
FROM table
WHERE ParentID = '0'
AND sortOrder = '3');
UPDATE table
SET sortOrder = '99'
WHERE ParentID = '0'
AND sortOrder = '3';
UPDATE table
SET sortOrder = @t2
WHERE ParentID = '0'
AND sortOrder = '2';
UPDATE table
SET sortOrder = @t1
WHERE ParentID = '0'
AND sortOrder = '99';
本篇文章回覆於2018-09-25 08:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
最有價值解答

小魚
檢舉此回應
你可以嘗試將它做成一個預存程序,
然後去呼叫這個程序,

或是用Parameter的方式直接從後端餵資料進去,
就不需要用SQL語法去呼叫這兩個變數了.
本篇文章回覆於2018-09-25 19:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

水靈
檢舉此回應
推薦可能是你第一次執行更新完變成兩筆或者你資料庫有兩筆
你用SET @int去存 一定要確保資料只有一筆 否則 就會跳錯 (sql 子查詢傳回不只 1 個值) 顧名思義就是你有好幾筆 你只有INT無法存
可以先試著從只有兩筆交換練習試試看
本篇文章回覆於2018-09-26 11:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

初階MIS
檢舉此回應
小魚大大,再次謝謝你的回覆
謝謝你的建議,的確這方式就不用再sql裡面呼叫變數了
本篇文章回覆於2018-09-26 14:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

初階MIS
檢舉此回應
謝謝水靈大大你的回覆,但是其實...這就是只有兩筆的資料交換的練習
本篇文章回覆於2018-09-26 14:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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