none
請問 DataKeyField 是否可以 用多鍵 RRS feed

  • 問題

  • 您好:

    想請問,以下範例 DataKeyField 只能用一個欄位

    那是否可以用多個欄位 當DataKeyField  呢,

    不然 若是以下範例 要多個where 條件 要如何用呢?

     

    <%@ Import NameSpace="System.Data" %>

    <%@ Import NameSpace="System.Data.OleDb" %>

     

    <Html

    <Body>

     

    <Form Runat="Server">

      <ASP:DataList Id="Dl1" Runat="Server"

           DataSource='<%# Ds %>'

           RepeatColumns="3"

           GridLines="Both"

           CellPadding="4"

           CellSpacing="4"     

           OnItemCommand="ShowItem"

           DataKeyField="姓名"

           OnDeleteCommand="DelItem"

           >     

       

        <ItemTemplate>

          姓名:<%# Container.DataItem("姓名") %><Br>

          <ASP:Button Id="Button1" Runat="Server" Text="檢視"/>

          <asp:Button ID="Button2" runat="Server" Text="刪除" CommandName="Delete"/>

        </ItemTemplate>

       

        <SelectedItemStyle BackColor="LightBlue"/>

        <SelectedItemTemplate>

          姓名:<%# Container.DataItem("姓名") %> <Br>

          電話:<%# Container.DataItem("電話") %> <Br>

          分類:<%# Container.DataItem("分類") %> <Br>

          <ASP:LinkButton Id="Button2" Runat="Server" Text="回上一層" OnClick="GoBack"/>

        </SelectedItemTemplate>

       

      </ASP:DataList>

    </Form>

     

    <Script Language="VB" Runat="Server">

      Private Ds As New DataSet()

      Sub Page_Load(Sender As Object, e As EventArgs)

        If Page.IsPostBack=False Then

          ShowAllData()

        End If

      End Sub

     

      Sub ShowAllData()

        Dim ConStr, SqlStr As String

        ConStr="Provider=Microsoft.Jet.OLEDB.4.0;"

            ConStr += "Data Source=" & Server.MapPath("..\..\x\1.mdb")

        SqlStr="Select * From 通訊錄"

        Dim Da As New OleDbDataAdapter(SqlStr, ConStr)

        Da.Fill(Ds, "通訊錄")

        Page.DataBind()

      End Sub

     

      Sub ShowItem(Sender As Object, e As DataListCommandEventArgs)

            Dl1.SelectedIndex = e.Item.ItemIndex  '選擇選取

        ShowAllData()

      End Sub

     

      Sub GoBack(Sender As Object, e As EventArgs)

            Dl1.SelectedIndex = -1  '取消選取

        ShowAllData()

        End Sub

      

        Sub DelItem(ByVal Sender As Object, ByVal e As DataListCommandEventArgs)

            Dim ConStr, DelStr, DelName As String

            ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;"

            ConStr += "Data Source=" & Server.MapPath("..\..\x\1.mdb")

            DelName = Dl1.DataKeys(e.Item.ItemIndex)  '例用索引取得姓名

            DelStr = "Delete From 通訊錄Where 姓名='"

            DelStr += DelName & "'"

            Dim Da As New OleDbDataAdapter(DelStr, ConStr)

            Da.Fill(Ds, "通訊錄") 執行DEL動作

            Dl1.SelectedIndex = -1 'GoBack(Sender, e)

            Ds.Clear() '清除目前狀態

            ShowAllData()  '重新取得資料並顯示

        End Sub

       

    </Script>

    </Body>

    </Html>

    2008年5月27日 下午 02:36

解答

  • 你可以試看看 DataKeyField="column1, column2" 的方法,如果不行,就只能另求方法,像是在 DataList.ItemDataBound 事件常式中去修改按鈕的 CommandArgument 屬性來帶入兩個參數。

     

    另外,你這種 SQL 寫法,會被惡意使用者用 SQL Injection 攻擊,最好還是用參數化查詢 (Parameterized Query) 方法來做。

     

    2008年5月28日 上午 11:15
    版主

所有回覆

  • 你可以試看看 DataKeyField="column1, column2" 的方法,如果不行,就只能另求方法,像是在 DataList.ItemDataBound 事件常式中去修改按鈕的 CommandArgument 屬性來帶入兩個參數。

     

    另外,你這種 SQL 寫法,會被惡意使用者用 SQL Injection 攻擊,最好還是用參數化查詢 (Parameterized Query) 方法來做。

     

    2008年5月28日 上午 11:15
    版主
  • Hi 最近資料庫遭攻擊的案件頻繁傳出,

    Sql injection的問題真的不可忽略,

    寧可花多點時間在程式碼上,

    也不要把時間花在清除遭受攻擊的資料上。

     

    2008年5月28日 下午 04:29
  • 謝謝!

    因為目前是初學ASP.NET

    所以還沒有考慮到 SQL injection 問題!

     

     

    2008年5月29日 下午 02:06