今天在網路上瀏覽時無意中看到外國論壇中一位網友的發問,讓我回想起以前剛好也遇過這個問題,在尋找答案時同樣花了很多時間,做了很多白工,最後終於順利的找到了答案。為了節省大家的時間,特別在這裡跟大家分享一下...
今天在網路上瀏覽時無意中看到外國論壇中一位網友的發問,讓我回想起以前剛好也遇過這個問題,在尋找答案時同樣花了很多時間,做了很多白工,最後終於順利的找到了答案。為了節省大家的時間,特別在這裡跟大家分享一下。
例如,我們可能在 Stored Procedure 中下了 Output 參數;最有可能的情況就是回傳自動增值的欄位:
CREATE PROCEDURE dbo.InserProduct
(
@ProductId int OUTPUT,
....
)
INSERT INTO ....
....
SELECT @PoductId = SCOPE_IDENTITY()
....
如果你使用 SqlDataSource 搭配這個 StoredProcedure 來做為 FormView 或 DetailsView 的 DataSource,的話,你大概會這麼寫:
<asp:SqlDataSource ID="sds1" runat="server" ....
InsertCommand="InserProduct" InsertCommandType="StoredProcedure">
....
<InsertParameters>
<asp:Parameter Direction="Output" Name="ProductId" Type="Int32" />
....
</InsertParameters>
</asp:SqlDataSource>
問題來了,你這麼寫是完全正確的,但是這個 Parameter("ProductId") 的值要怎麼得到?如果你從 FormView 或 DetailsView 的 ItemInserted 事件中企圖拿到 Parameter("ProductId").Value,那麼你只會看到一個錯誤訊息:「Value 不是 WebControls.Parameter 的 Member」。Parameter 型別根本沒有 Value 屬性!怎麼辦?
答案簡單的要命!不要再從 FormView/DetailsView 的 ItemInserted 事件中浪費時間了,你應該從 SqlDataSource 的 Inserted 事件中著手:
Protected Sub SqlDataSource1_Inserted(....) Handles SqlDataSource1.Inserted
MsgBox(e.Command.Parameters("@productId").Value)
End Sub
在這裡 e.Command.Parameters(XXX) 傳回的是 DbParameter 而不是 WebControls.Parameter 型別物件,所以有 Value 屬性,並且可以取得它的值。不過請稍為注意其引數的寫法是 @ProductId,前面的小老鼠符號不能省略。