SqlDataSource Command 字串參數裡面的對應數值

SqlDataSource Command 字串參數裡面的對應數值

前言

SqlDataSource裡面總共可以下達四種指令(Command): InsertCommand, UpdateCommand, DeleteCommand SelectCommand。這些Command其實只是SQL語法,不過裡面可以使用@參數名來帶參數。

 

我其實一直不是很確定為什麼當我使用GridView裡面編輯功能的時候,他為什麼能夠很準確的知道我在改哪一個,因此我遇到了一個問題。

 

題外話:如果對於我的解決過程不感興趣,直接跳到「學習到的東西」即可。

還有我無法確認是否我的結論是正確的,不過我通過我的嘗試覺得應該是如此。

 

問題

我有一個DB Table,裡面所擁有的是一個購物車相關訊息,這些訊息將會被我使用SqlDataSource加上GridView來展現出來,不過我希望使用者可以自行更改 購物車每樣物品的Quantity(數量)

 

因為我的DB所有Column使用的是英文,因此我寫SqlDataSource SelectCommand的時候使用了AS來把它變成中文,因此Sql Query 如下:

SelectCommand=

"SELECT CartId, MealName AS 餐名, Price AS 單價, Quantity AS 數量,Price * Quantity AS 金額

FROM ShoppingCart

WHERE (ShoppingCart.CusId = @CusId)"

 

一切看起來都沒甚麼問題,不過當我寫我的UpdateCommand Query的時候,當執行 更新 的時候竟然沒有反應(數字沒有改變),這是為什麼?

UpdateCommand="UPDATE ShoppingCart SET Quantity = @Quantity WHERE (CartId = @CartId)"

 

問題思考

我的第一反應是,我的SQL修改的有問題。因此,我從新拉了一個SqlDataSource,然後使用預設的CRUD,再拉一個GridView,連上SqlDataSource,運行。修改、更新皆沒問題。

 

這個時候,我在開啟SqlDataSource裡面的設定精靈,到了SELECT Query的部分,我改成【指定自訂SQL陳述式或預存程序】:

clip_image002

然後我甚麼都沒有改,只是在【別名】的部份加上中文顯示:

clip_image004

其他一切都沒有更改,執行,這時候當我【編輯】完畢要更新的時候,更改過的數字不會儲存變動。

 

這時候我知道了,如果使用AS,那麼不知道為什麼修改的部分就不會更新了。

 

難道說不能使用AS搭配SqlDataSource?這時候我的同學說,有一個辦法可以試試看。我們不使用AS,不過在GridView【編輯資料行】的時候把【Header Text】改成中文試試看,我以我們嘗試:

clip_image006

結果,修改結果沒有問題,有被保存下來。

 

這時我又提出疑問,有些欄位在DB裡面並沒有被儲存,例如【總額】是由【Quantity(數量)*Price(單價)】,而他一定會使用到AS。所以我們嘗試了,加上這一欄位,發現,修改的內容還是有所保存。

 

那麼問題來了,並不是AS無法使用,而是其他東西干擾到了,那到底是甚麼呢?

 

這時我突然想到,當我們在做SQL Command會使用@參數名子 來做為變數,那他到底是對應到哪裡?

 

例如:

UpdateCommand="UPDATE ShoppingCart SET Quantity = @Quantity WHERE (CartId = @CartId)"

 

我本來以為對應到的是:
                <UpdateParameters>

                    <asp:Parameter Name="Quantity" />

                    <asp:Parameter Name="CartId" />

                </UpdateParameters>

但是假設不是,假設他是對應到SELECT裡面,所以使用AS以後更改了名子才會對應不到,所以我把 @Quantity 改成對應 SELECT 裡面的 @數量:

SelectCommand=

"SELECT CartId, MealName AS 餐名, Price AS 單價, Quantity AS 數量,Price * Quantity AS 金額

FROM ShoppingCart

WHERE (ShoppingCart.CusId = @CusId)"

 

變成:

UpdateCommand="UPDATE ShoppingCart SET Quantity = @數量WHERE (CartId = @CartId)"

 

                <UpdateParameters>

                    <asp:Parameter Name="數量" />

                    <asp:Parameter Name="CartId" />

                </UpdateParameters>

 

結果就可以了。那麼又兩個問題來了,他是如何知道 @數量 應該對應到我修改的地方,SELECT Query肯定不知道這一點,那他是如何知道的? 同時,如果我把 @數量 assign到別的欄位的值會怎麼樣?

針對後面的問題,我嘗試多Update一個欄位,這次我也使用 @數量 為變數。結果發現,那個欄位的數值變得和 修改 @數量欄位的數值一樣,這告訴我, @數量 一定是到某個地方把我在修改時輸入的值給提取出來了。

 

至於數值在哪提出來的,本來我想說是不是SQL SELECT command 裡面,但想想應該不可能,畢竟那本身也只是一個字串而已,那麼會部會是從 UpdateParameter裡面取得的?所以我常是把UpdateParameter的數值改掉:

UpdateCommand="UPDATE ShoppingCart SET Quantity = @數量WHERE (CartId = @CartId)"

 

                <UpdateParameters>

                    <asp:Parameter Name="數量123" />

                    <asp:Parameter Name="CartId" />

                </UpdateParameters>

 

結果我發現,一樣可以修改數量,而且沒有問題,所以那個我輸入的數值不是從這邊來的。那麼這次我反果來,修改Query裡面但沒修改 UpdateParameters:

UpdateCommand="UPDATE ShoppingCart SET Quantity = @數量123 WHERE (CartId = @CartId)"

 

                <UpdateParameters>

                    <asp:Parameter Name="數量" />

                    <asp:Parameter Name="CartId" />

                </UpdateParameters>

 

結果修改的時候,出現一個exception Must declare the scalar variable】。

 

這個時候我想,會不會其實在 SQL 字串的變數會有兩種情況:

1.         如果找到 @variableName 那麼就使用那個值。

2.         如果1不成立,那就去Parameters找這一個變數

所以沒有一個變數叫做【數量123】所以她丟一個exceptionParameters是設定初始或著沒有找到的值。

 

最後,問題來了,1裡面提到的找值,到底是去哪裡找?

 

答案是去GridView裡面的Columns裡面的<asp:BoundField DataField>裡面找到的,他和AS的名字一模一樣。

 

不過裏面我也發現,不知道爲什麽我有加 <asp:BoundField DataField=”CartId”> 但是他還是對應不到,我看了一下,GridView可以加一個DataKeyName,這一個主要顯示那個欄位為PK,所以加上以後就對應到了。

 

學習到的東西

SqlDataSource的幾種Command裏面@開頭皆為變數,而變數的對應數值則是看兩個地方:

1.         GridView –Columns-》《Asp:BoundField DataField》裏面對應的名稱。

GridView 裏面的DataKeyName對於對應也有幫助。

                           

2.         UpdateParameters》裏面對應的 Name

 

總結

其實我覺的這個在熟悉Asp .Net WebForm的人來說應該都不是問題,或者是只是小問題,不過如果基礎沒有瞭解扎實,將會遇到一些問題而且非常難解。解決辦法只能像我這樣土法煉鋼或者問人,不過我覺得最好的辦法還是把基礎學的扎實。


Google+

創用 CC 授權條款
Alan Tsai 的隨手筆記Alan Tsai製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。