[DataSource] 取出 Output Pamameter 的值

今天在網路上瀏覽時無意中看到外國論壇中一位網友的發問,讓我回想起以前剛好也遇過這個問題,在尋找答案時同樣花了很多時間,做了很多白工,最後終於順利的找到了答案。為了節省大家的時間,特別在這裡跟大家分享一下...

 

今天在網路上瀏覽時無意中看到外國論壇中一位網友的發問,讓我回想起以前剛好也遇過這個問題,在尋找答案時同樣花了很多時間,做了很多白工,最後終於順利的找到了答案。為了節省大家的時間,特別在這裡跟大家分享一下。

例如,我們可能在 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,前面的小老鼠符號不能省略。


Dev 2Share @ 點部落