[SqlDataSource] 變更資料之前動態修改參數內容

我這幾天遇到一個問題; 客戶希望我能修改一個既有的程式, 假設某個輸入欄位 (假設是 Alias) 的值未被輸入的話, 就取其它欄位 (例如 Name) 的值來取代。這原本應該是一個很簡單也很容易達成的任務,但下手去做之後才發現恐怕沒有想像中那麼簡單...

 

我這幾天遇到一個問題; 客戶希望我能修改一個既有的程式, 假設某個輸入欄位 (假設是 Alias) 的值未被輸入的話, 就取其它欄位 (例如 Name) 的值來取代。

這原本應該是一個很簡單也很容易達成的任務,但下手去做之後才發現恐怕沒有想像中那麼簡單。因為我使用了 SqlDataSource 作為 DetailsView 的 DataSource,原本是一行程式都不需要寫的;現在如果要在 SqlDataSource 物件在插入資料庫之前予以欄截,一時間還真不知道從何著手。

本來都已經要著手準備使用 ADO.NET 來重寫了,但靈機一動,心想,SqlDataSource 不也是使用 ADO.NET 來實作的嗎?那麼我為什麼不能套用它原來的機制,應該可以省下不少工夫才對!

幾經思量,終於讓我找到很快速的解決方法。原理也非常簡單,我以下分成兩個步驟來解釋:

首先,請把 SqlDataSource 的 InsertParameters 中把要動態給值的項目拿掉。例如,如果原來的 InsertParameters 是

<InsertParameters>
    <asp:Parameter Name="id" Type="String" />
    <asp:Parameter Name="Name" Type="Boolean" />
    <asp:Parameter Name="Alias" Type="String" />
</InsertParametes>

請把要變動的 Alias 參數拿掉,變成如下:

<InsertParameters>
    <asp:Parameter Name="id" Type="String" />
    <asp:Parameter Name="Name" Type="Boolean" />
</InsertParametes> 

接著,在 DetailsView dv 的 Inserting 事件中對 SqlDataSource 把剛才拿掉的 的 InsertParameter 加上去:

VB -

Protected Sub dv_ItemInserting(...) Handles dv.ItemInserting
    Dim txtAlias As TextBox = dv.FindControl("txtAlias")
    Dim txtName As TextBox = dv.FindControl("txtName")
    If txtAlias IsNot Nothing AndAlso txtAlias.Text.Trim = String.Empty AndAlso txtName IsNot Nothing Then
        '如果 Alias 欄位為空白則以 Name 欄位的值予以取代
        SqlDataSource1.InsertParameters.Add("Alias", txtName.Text.Trim)
        '也可以寫成 SqlDataSource1.InsertParameters.Add("Alias").Value = txtName.Text.Trim
    End If
End Sub

VB -

protected  void dv_ItemInserting(...)
{
    TextBox txtAlias = dv.FindControl("txtAlias");
    TextBox txtName = dv.FindControl("txtName");
    if (txtAlias != null && txtAlias.Text.Trim() == string.Empty && txtName != null)
    // 如果 Alias 欄位為空白則以 Name 欄位的值予以取代
       SqlDataSource1.InsertParameters.Add("Alias", txtName.Text.Trim())
    // 也可以寫成 SqlDataSource1.InsertParameters.Add("Alias").Value = txtName.Text.Trim()
}

請注意,請不要自作聰明的在 ItemInserting 事件中去下 SqlDataSource.Insert 指令。如此做會等同於你取代了 SqlDataSource 原本要做的事情,那麼你不但要手動加上所有的 InsertParameters,還得手動去指定所有的值,那麼還不要使用 SqlDataSource 算了。此外,已在 SqlDataSource1 中已經宣告的其它的 Parameters (例如 id 與 Name) 都不需要再宣告一次,否則會發生錯誤。


Dev 2Share @ 點部落