在 ASP.NET Web Pages (Razor) 網站中使用資料庫的簡介

作者:Tom FitzMacken

本文說明如何使用 Microsoft WebMatrix 工具在 ASP.NET Web Pages (Razor) 網站中建立資料庫,以及如何建立可讓您顯示、新增、編輯和刪除資料的頁面。

您將瞭解的內容:

  • 如何建立資料庫。
  • 如何連線到資料庫。
  • 如何在網頁中顯示資料。
  • 如何插入、更新和刪除資料庫記錄。

以下是文章仲介紹的功能:

  • 使用 Microsoft SQL Server Compact Edition 資料庫。
  • 使用 SQL 查詢。
  • Database 類別。

教學課程中使用的軟體版本

  • ASP.NET Web Pages (Razor) 2
  • WebMatrix 2

本教學課程也適用于 WebMatrix 3。 您可以針對 Web) 使用 ASP.NET Web Pages 3 和 Visual Studio 2013 (或 Visual Studio Express 2013;不過,使用者介面會不同。

資料庫簡介

想像一般的通訊錄。 針對通訊錄 (中的每個專案,也就是針對每個人) ,您有數項資訊,例如名字、姓氏、位址、電子郵件地址和電話號碼。

像這樣圖片資料的一般方式是做為具有資料列和資料行的資料表。 在資料庫詞彙中,每個資料列通常稱為記錄。 每個資料行 (有時稱為欄位) 包含每種資料類型的值:名字、姓氏等等。

識別碼 名字 姓氏 位址 電子郵件 電話
1 Jim Abrus 210 100th St SE Orcas WA 98031 jim@contoso.com 555 0100
2 Terry Adams 1234 主要 St. Seattle WA 99011 terry@cohowinery.com 555 0101

對於大部分的資料庫資料表,資料表必須有包含唯一識別碼的資料行,例如客戶號碼、帳戶號碼等。這稱為資料表 的主鍵,您可以使用它來識別資料表中的每個資料列。 在此範例中,ID 資料行是通訊錄的主鍵。

有了對資料庫的基本瞭解,您就可以瞭解如何建立簡單的資料庫,並執行新增、修改和刪除資料等作業。

提示

關係資料庫

您可以使用許多方式來儲存資料,包括文字檔和試算表。 不過,對於大部分的企業用途而言,資料會儲存在關係資料庫中。

本文不會深入探討資料庫。 不過,您可能會發現對它們有一些瞭解很有用。 在關係資料庫中,資訊會以邏輯方式分成不同的資料表。 例如,學校的資料庫可能包含學生和班級供應專案的個別資料表。 資料庫軟體 (,例如 SQL Server) 支援功能強大的命令,可讓您動態建立資料表之間的關聯性。 例如,您可以使用關係資料庫建立學生和班級之間的邏輯關聯性,以建立排程。 將資料儲存在不同的資料表中可減少資料表結構的複雜度,並減少將資料保留在資料表中的需求。

建立資料庫

此程式說明如何使用 WebMatrix 中包含的 SQL Server Compact Database 設計工具,建立名為 SmallBakery 的資料庫。 雖然您可以使用程式碼建立資料庫,但使用 WebMatrix 之類的設計工具建立資料庫和資料庫資料表會比較常見。

  1. 啟動 WebMatrix,然後在 [快速入門] 頁面上,按一下 [ 網站來源範本]。

  2. 選取 [空白網站],然後在 [ 網站名稱 ] 方塊中輸入 「SmallBakery」,然後按一下 [ 確定]。 網站隨即建立並顯示在 WebMatrix 中。

  3. 在左窗格中,按一下 [ 資料庫] 工作區。

  4. 在功能區中,按一下 [ 新增資料庫]。 系統會使用與您的網站相同的名稱來建立空的資料庫。

  5. 在左窗格中,展開 SmallBakery.sdf 節點,然後按一下 [ 資料表]。

  6. 在功能區中,按一下 [ 新增資料表]。 WebMatrix 會開啟資料表設計工具。

    [顯示開啟資料表設計工具的 Web 矩陣螢幕擷取畫面。]

  7. 按一下 [ 名稱] 資料行,然後輸入 「Id」。

  8. 在 [ 資料類型] 資料 行中,選取 int

  9. 將 [ 主鍵?] 和 [ 識別嗎?] 選項設定為 [是]。

    如名稱所示, Is Primary Key 會告訴資料庫,這會是資料表的主鍵。 身分識別 會告訴資料庫為每個新記錄自動建立識別碼,並將下一個序號指派給下一個序號 (,從 1) 開始。

  10. 按一下下一個資料列。 編輯器會啟動新的資料行定義。

  11. 針對 [名稱] 值,輸入 「Name」。

  12. 針對 [資料類型],選擇 [Nvarchar],並將長度設定為 50。 的 nvarcharvar部分會告知資料庫,此資料行的資料將是字串,其大小可能會因記錄而異。 (n 前置詞代表 國家/地區,表示欄位可以保存代表任何字母或寫入系統的字元資料,也就是欄位保存 Unicode data.)

  13. 將 [ 允許 Null] 選項設定為 [否]。 這會強制 [ 名稱] 資料行未保留空白。

  14. 使用相同的程式,建立名為 Description的資料行。 將 [資料類型 ] 設定為 「Nvarchar」 和 50 表示長度,並將 [允許 Null] 設定為 false。

  15. 建立名為 Price的資料行。 將 [資料類型] 設定為 「money」, 並將 [允許 Null] 設定為 false。

  16. 在頂端的方塊中,將資料表命名為 「Product」。

    完成時,定義看起來會像這樣:

    [螢幕擷取畫面顯示定義完成時的外觀。]

  17. 按 Ctrl+S 儲存表格。

將資料新增至資料庫

現在,您可以將一些範例資料新增至您稍後將在文章中使用的資料庫。

  1. 在左窗格中,展開 SmallBakery.sdf 節點,然後按一下 [ 資料表]。

  2. 以滑鼠右鍵按一下 [Product] 資料表,然後按一下 [ 資料]。

  3. 在編輯窗格中,輸入下列記錄:

    名稱 描述 Price
    麵包 每天製作全新。 2.99
    擷取短片 從我們的園地使用有機水果製作。 9.99
    Apple Pie 第二個只有您母親的圓形圖。 12.99
    Pecan Pie 如果您想要 pecan,這適合您。 10.99
    圓形圓形圖 以全世界最好的口味製作。 11.99
    杯子蛋糕 您的兒童和兒童會喜歡這些。 7.99

    請記住,您不需要為 [ 識別碼 ] 資料行輸入任何專案。 當您 建立 Id 資料 行時,您會將其 Is Identity 屬性設定為 true,這會導致它自動填入。

    當您完成輸入資料時,資料表設計工具看起來會像這樣:

    [螢幕擷取畫面顯示當資料完成輸入時,資料表設計工具的外觀。]

  4. 關閉包含資料庫資料的索引標籤。

顯示資料庫中的資料

一旦您擁有具有資料的資料庫,您就可以在 ASP.NET 網頁中顯示資料。 若要選取要顯示的資料表資料列,請使用 SQL 語句,這是您傳遞至資料庫的命令。

  1. 在左窗格中,按一下 [ 檔案] 工作區。

  2. 在網站的根目錄中,建立名為 ListProducts.cshtml的新 CSHTML 頁面。

  3. 以下列專案取代現有的標記:

    @{
        var db = Database.Open("SmallBakery");
        var selectQueryString = "SELECT * FROM Product ORDER BY Name";
     }
    <!DOCTYPE html>
    <html>
     <head>
       <title>Small Bakery Products</title>
       <style>
           table, th, td {
             border: solid 1px #bbbbbb;
             border-collapse: collapse;
             padding: 2px;
           }
        </style>
     </head>
     <body>
       <h1>Small Bakery Products</h1>
       <table>
           <thead>
               <tr>
                   <th>Id</th>
                   <th>Product</th>
                   <th>Description</th>
           <th>Price</th>
               </tr>
           </thead>
           <tbody>
               @foreach(var row in db.Query(selectQueryString)){
                <tr>
                   <td>@row.Id</td>
                       <td>@row.Name</td>
                       <td>@row.Description</td>
                       <td>@row.Price</td>
                </tr>
               }
           </tbody>
       </table>
     </body>
    </html>
    

    在第一個程式碼區塊中,您會 (稍早建立的資料庫) 開啟 SmallBakery.sdf 檔案。 方法 Database.Open 假設 .sdf 檔案位於網站的 App_Data 資料夾中。 (請注意,您不需要指定 .sdf 副檔名 ,事實上,如果您這麼做, Open 方法將無法運作。)

    注意

    App_Data資料夾是 ASP.NET 中用來儲存資料檔案的特殊資料夾。 如需詳細資訊,請參閱本文稍後的 連線到資料庫

    接著,您會使用下列 SQL Select 語句提出查詢資料庫的要求:

    SELECT * FROM Product ORDER BY Name
    

    在 語句中, Product 識別要查詢的資料表。 *字元會指定查詢應該從資料表傳回所有資料行。 (如果您想要只看到部分資料行,您也可以個別列出以逗號分隔的資料行。) 子 Order By 句會指出資料應該如何排序,在此案例中為 Name資料行。 這表示資料會根據每個資料列的 Name 資料行值,依字母順序排序。

    在頁面本文中,標記會建立 HTML 資料表,以用來顯示資料。 在 <tbody> 元素內,您可以使用 foreach 迴圈個別取得查詢所傳回的每個資料列。 針對每個資料列,您會建立 HTML 資料表資料列 (<tr> 元素) 。 然後,您會為每個資料行建立 HTML 表格儲存格 (<td> 元素) 。 每次完成迴圈時,資料庫中的下一個可用資料列會位於 變數中 row , (您在 語句中 foreach 設定此資料列) 。 若要從資料列取得個別資料行,您可以使用 row.Name 或任何 row.Description 名稱是您想要的資料行名稱。

  4. 在瀏覽器中執行頁面。 (執行之前,請確定已在 [ 檔案] 工作區中選取頁面。) 此頁面會顯示如下的清單:

    [顯示頁面將在瀏覽器中顯示的清單螢幕擷取畫面。]

提示

結構化查詢語言 (SQL) (機器翻譯)

SQL 是大部分關係資料庫中用來管理資料庫中資料的語言。 它包含命令,可讓您擷取資料並加以更新,以及讓您建立、修改及管理資料庫資料表。 SQL 與程式設計語言 (不同,就像您在 WebMatrix) 中使用的語言一樣,因為使用 SQL,其概念是告訴您資料庫所需的專案,而這是資料庫的工作,以瞭解如何取得資料或執行工作。 以下是一些 SQL 命令及其用途的範例:

SELECT Id, Name, Price FROM Product WHERE Price > 10.00 ORDER BY Name

如果 Price 的值超過 10,則會從Product資料表中的記錄擷取Id、NamePrice資料行,並根據Name資料行的值依字母順序傳回結果。 此命令會傳回結果集,其中包含符合準則的記錄,如果沒有相符的記錄,則會傳回空白集合。

INSERT INTO Product (Name, Description, Price) VALUES ("Croissant", "A flaky delight", 1.99)

這會將新記錄插入 Product 資料表中 ,將 [名稱] 資料行設定為 「一元」、將 [描述] 資料行設定為 「A flaky 點快樂」,並將價格設定為 1.99。

DELETE FROM Product WHERE ExpirationDate < "01/01/2008"

此命令會刪除 Product 資料表中的記錄,其到期日期資料行早于 2008 年 1 月 1 日。 (這假設 Product 資料表有這類資料行。當然。) 日期會以 MM/DD/YYYY 格式輸入這裡,但應該以用於地區設定的格式輸入。

Insert IntoDelete 命令不會傳回結果集。 相反地,它們會傳回一個數位,告知命令影響多少筆記錄。

對於其中一些作業 (,例如插入和刪除記錄) ,要求作業的程式必須在資料庫中具有適當的許可權。 這就是為什麼在連線到資料庫時,您通常必須提供使用者名稱和密碼的生產資料庫。

有數十個 SQL 命令,但它們全都遵循類似這樣的模式。 您可以使用 SQL 命令來建立資料庫資料表、計算資料表中的記錄數目、計算價格,以及執行更多作業。

在資料庫中插入資料

本節說明如何建立頁面,讓使用者將新產品新增至 Product 資料庫資料表。 插入新產品記錄之後,頁面會使用您在上一節中建立的 ListProducts.cshtml 頁面來顯示更新的資料表。

此頁面包含驗證,以確保使用者輸入的資料對資料庫有效。 例如,頁面中的程式碼可確保已針對所有必要的資料行輸入值。

  1. 在網站中,建立名為 InsertProducts.cshtml 的新 CSHTML檔案。

  2. 以下列專案取代現有的標記:

    @{
        Validation.RequireField("Name", "Product name is required.");
        Validation.RequireField("Description", "Product description is required.");
        Validation.RequireField("Price", "Product price is required.");
    
        var db = Database.Open("SmallBakery");
        var Name = Request.Form["Name"];
        var Description = Request.Form["Description"];
        var Price = Request.Form["Price"];
    
        if (IsPost && Validation.IsValid()) {
            // Define the insert query. The values to assign to the
            // columns in the Product table are defined as parameters
            // with the VALUES keyword.
            if(ModelState.IsValid) {
                var insertQuery = "INSERT INTO Product (Name, Description, Price) " +
                    "VALUES (@0, @1, @2)";
                db.Execute(insertQuery, Name, Description, Price);
                // Display the page that lists products.
                Response.Redirect("~/ListProducts");
            }
        }
    }
    
    <!DOCTYPE html>
    <html>
    <head>
     <title>Add Products</title>
     <style type="text/css">
        label {float:left; width: 8em; text-align: right;
               margin-right: 0.5em;}
        fieldset {padding: 1em; border: 1px solid; width: 50em;}
        legend {padding: 2px 4px; border: 1px solid; font-weight:bold;}
        .validation-summary-errors {font-weight:bold; color:red;
               font-size: 11pt;}
     </style>
    </head>
    <body>
     <h1>Add New Product</h1>
    
     @Html.ValidationSummary("Errors with your submission:")
    
     <form method="post" action="">
       <fieldset>
         <legend>Add Product</legend>
         <div>
           <label>Name:</label>
           <input name="Name" type="text" size="50" value="@Name" />
         </div>
         <div>
           <label>Description:</label>
           <input name="Description" type="text" size="50"
               value="@Description" />
         </div>
         <div>
           <label>Price:</label>
           <input name="Price" type="text" size="50" value="@Price" />
         </div>
         <div>
           <label>&nbsp;</label>
           <input type="submit" value="Insert" class="submit" />
         </div>
       </fieldset>
     </form>
    </body>
    </html>
    

    頁面本文包含一個 HTML 表單,其中包含三個文字方塊,讓使用者輸入名稱、描述和價格。 當使用者按一下 [插入] 按鈕時,頁面頂端的程式碼會開啟 SmallBakery.sdf 資料庫的連線。 然後,您會取得使用者已使用 Request 物件提交的值,並將這些值指派給區域變數。

    若要驗證使用者輸入每個必要資料行的值,您可以註冊要驗證的每個 <input> 元素:

    Validation.RequireField("Name", "Product name is required.");
    Validation.RequireField("Description", "Product description is required.");
    Validation.RequireField("Price", "Product price is required.");
    

    協助 Validation 程式會檢查您已註冊的每個欄位是否有值。 您可以藉由檢查 來 Validation.IsValid() 測試所有欄位是否通過驗證,這通常會在您處理從使用者取得的資訊之前執行此動作:

    if (IsPost && Validation.IsValid()) {
        // Process information here
    }
    

    && (運算子表示 AND — 此測試是如果這是表單提交,而且所有欄位都已通過驗證。)

    如果驗證的所有資料行都 (都不是空的) ,您可以繼續建立 SQL 語句來插入資料,然後執行它,如下所示:

    var insertQuery =
        "INSERT INTO Product (Name, Description, Price) VALUES (@0, @1, @2)";
    

    若要插入這些值,您會在 、、 @1@2) 中包含參數預留位置 (@0

    注意

    作為安全性預防措施,請一律使用參數將值傳遞至 SQL 語句,如上述範例所示。 這可讓您驗證使用者的資料,並協助防止嘗試將惡意命令傳送至資料庫 (有時稱為 SQL 插入式攻擊) 。

    若要執行查詢,您可以使用這個語句,將包含值的變數傳遞給它,以取代預留位置:

    db.Execute(insertQuery, Name, Description, Price);
    

    Insert Into執行 語句之後,您會將使用者傳送至使用這一行列出產品的頁面:

    Response.Redirect("~/ListProducts");
    

    如果驗證失敗,您可以略過插入。 相反地,您可以在頁面中有一個協助程式,可在有任何) 時顯示累積的錯誤訊息 (:

    @Html.ValidationSummary("Errors with your submission:")
    

    請注意,標記中的樣式區塊包含名為 的 .validation-summary-errors CSS 類別定義。 這是預設用於 <div> 包含任何驗證錯誤的元素的 CSS 類別名稱。 在此情況下,CSS 類別會指定驗證摘要錯誤以紅色和粗體顯示,但您可以定義 .validation-summary-errors 類別來顯示您想要的任何格式設定。

測試插入頁面

  1. 在瀏覽器中檢視頁面。 頁面會顯示類似下圖所示的表單。

    [螢幕擷取畫面顯示將在瀏覽器中頁面顯示的表單。]

  2. 輸入所有資料行的值,但請確定您將 Price 資料行保留空白。

  3. 按一下 [插入] 。 頁面會顯示錯誤訊息,如下圖所示。 (未建立任何新記錄。)

    [顯示錯誤訊息的螢幕擷取畫面。]

  4. 完整填寫表單,然後按一下 [ 插入]。 這次會顯示 ListProducts.cshtml 頁面,並顯示新記錄。

更新資料庫中的資料

將資料輸入資料表之後,您可能需要更新它。 此程式說明如何建立兩個頁面,類似于您稍早為數據插入所建立的頁面。 第一頁會顯示產品,並讓使用者選取要變更的產品。 第二頁可讓使用者實際進行編輯並儲存。

注意

重要 在生產網站中,您通常會限制誰能夠對資料進行變更。 如需如何設定成員資格,以及如何授權使用者在網站上執行工作的詳細資訊,請參閱將安全性和成員資格新增至 ASP.NET Web Pages網站

  1. 在網站中,建立名為 EditProducts.cshtml 的新 CSHTML檔案。

  2. 以下列內容取代 檔案中的現有標記:

    @{
        var db = Database.Open("SmallBakery");
        var selectQueryString = "SELECT * FROM Product ORDER BY Name";
    
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>Edit Products</title>
        <style type="text/css">
            table, th, td {
              border: solid 1px #bbbbbb;
              border-collapse: collapse;
              padding: 2px;
            }
        </style>
    </head>
    <body>
        <h1>Edit Small Bakery Products</h1>
        <table>
          <thead>
            <tr>
              <th>&nbsp;</th>
              <th>Name</th>
              <th>Description</th>
              <th>Price</th>
            </tr>
          </thead>
          <tbody>
            @foreach (var row in db.Query(selectQueryString)) {
              <tr>
                <td><a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td>
                <td>@row.Name</td>
                <td>@row.Description</td>
                <td>@row.Price</td>
              </tr>
            }
          </tbody>
        </table>
    </body>
    </html>
    

    此頁面與先前 的 ListProducts.cshtml 頁面唯一差異在於此頁面中的 HTML 資料表包含額外資料行,以顯示 [編輯] 連結。 當您按一下此連結時,它會帶您前往 UpdateProducts.cshtml 頁面, (您將在其中建立下一個) ,您可以在其中編輯選取的記錄。

    查看建立 [編輯 ] 連結的程式碼:

    <a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td>
    

    這會建立 HTML <a> 專案,其 href 屬性會動態設定。 屬性 href 會指定要在使用者按一下連結時顯示的頁面。 它也會將 Id 目前資料列的值傳遞至連結。 當頁面執行時,頁面來源可能包含如下的連結:

    <a href="UpdateProducts/1">Edit</a></td>
    <a href="UpdateProducts/2">Edit</a></td>
    <a href="UpdateProducts/3">Edit</a></td>
    

    請注意,屬性 href 設定為 UpdateProducts/n ,其中 n 是產品名稱。 當使用者按一下下列其中一個連結時,產生的 URL 看起來會像這樣:

    http://localhost:18816/UpdateProducts/6

    換句話說,要編輯的產品名稱將會傳入 URL。

  3. 在瀏覽器中檢視頁面。 頁面會以類似下列格式顯示資料:

    [螢幕擷取畫面顯示顯示在瀏覽器中頁面的資料。]

    接下來,您將建立頁面,讓使用者實際更新資料。 更新頁面包含驗證,以驗證使用者輸入的資料。 例如,頁面中的程式碼可確保已針對所有必要的資料行輸入值。

  4. 在網站中,建立名為 UpdateProducts.cshtml 的新 CSHTML檔案。

  5. 以下列內容取代 檔案中的現有標記。

    @{
        Validation.RequireField("Name", "Product name is required.");
        Validation.RequireField("Description", "Product description is required.");
        Validation.RequireField("Price", "Product price is required.");
    
        var Name = "";
        var Description = "";
        var Price = Decimal.Zero;
    
        var ProductId  = UrlData[0];
        if (ProductId.IsEmpty()) {
             Response.Redirect("~/EditProducts");
        }
    
        var db = Database.Open("SmallBakery");
    
        if (IsPost && Validation.IsValid()) {
            var updateQueryString =
                "UPDATE Product SET Name=@0, Description=@1, Price=@2 WHERE Id=@3" ;
            Name = Request["Name"];
            Description = Request["Description"];
            Price = Request["Price"].AsDecimal();
            db.Execute(updateQueryString, Name, Description, Price, ProductId);
            Response.Redirect(@Href("~/EditProducts"));
        }
        else {
            var selectQueryString = "SELECT * FROM Product WHERE Id=@0";
    
            var row = db.QuerySingle(selectQueryString, ProductId);
            Name = row.Name;
            Description = row.Description;
            Price = row.Price;
        }
    
    }
    
    <!DOCTYPE html>
    <html>
    <head>
      <title>Add Products</title>
      <style type="text/css">
         label { float: left; width: 8em; text-align: right;
                 margin-right: 0.5em;}
         fieldset { padding: 1em; border: 1px solid; width: 35em;}
         legend { padding: 2px 4px;  border: 1px solid; font-weight: bold;}
         .validation-summary-errors {font-weight:bold; color:red; font-size:11pt;}
      </style>
    </head>
    <body>
      <h1>Update Product</h1>
       @Html.ValidationSummary("Errors with your submission:")
       <form method="post" action="">
         <fieldset>
           <legend>Update Product</legend>
           <div>
             <label>Name:</label>
             <input name="Name" type="text" size="50" value="@Name" />
           </div>
           <div>
             <label>Description:</label>
             <input name="Description" type="text" size="50"
                value="@Description" />
           </div>
           <div>
              <label>Price:</label>
              <input name="Price" type="text" size="50" value="@Price" />
           </div>
           <div>
              <label>&nbsp;</label>
              <input type="submit" value="Update" class="submit" />
           </div>
        </fieldset>
      </form>
    </body>
    </html>
    

    頁面的本文包含顯示產品的 HTML 表單,以及使用者可以編輯它的位置。 若要顯示產品,請使用此 SQL 語句:

    SELECT * FROM Product WHERE Id=@0
    

    這會選取識別碼符合參數中 @0 傳遞之值的產品。 (因為 識別碼 是主鍵,因此必須是唯一的,所以只能以這種方式選取一個產品記錄。) 若要取得要傳遞至此 Select 語句的識別碼值,您可以使用下列語法來讀取傳遞至頁面的值:

    var ProductId  = UrlData[0];
    

    若要實際擷取產品記錄,您可以使用 QuerySingle 方法,只會傳回一筆記錄:

    var row = db.QuerySingle(selectQueryString, ProductId);
    

    單一資料列會傳回至 row 變數。 您可以從每個資料行取得資料,並將其指派給區域變數,如下所示:

    var Name = row.Name;
    var Description = row.Description;
    var Price = row.Price;
    

    在表單的標記中,這些值會使用如下的內嵌程式碼,自動顯示在個別文字方塊中:

    <input name="Name" type="text" size="50" value="@Name" />
    

    該程式碼的該部分會顯示要更新的產品記錄。 一旦顯示記錄,使用者就可以編輯個別的資料行。

    當使用者按一下 [ 更新] 按鈕提交表單時,區塊中的程式碼就會 if(IsPost) 執行。 這會從 Request 物件取得使用者的值、將值儲存在變數中,並驗證每個資料行是否已填入。 如果通過驗證,程式碼會建立下列 SQL Update 語句:

    UPDATE Product SET Name=@0, Description=@1, Price=@2, WHERE ID=@3
    

    在 SQL Update 語句中,您可以指定要更新的每個資料行,以及要設定它的值。 在此程式碼中,會使用參數預留位置 @0@1@2 等等來指定值。 (如先前所述,基於安全性,您應該一律使用 parameters.) 將值傳遞至 SQL 語句

    當您呼叫 方法時 db.Execute ,會以對應至 SQL 語句中參數的順序傳遞包含值的變數:

    db.Execute(updateQueryString, Name, Description, Price, ProductId);
    

    Update執行 語句之後,您可以呼叫下列方法來將使用者重新導向回編輯頁面:

    Response.Redirect(@Href("~/EditProducts"));
    

    效果是使用者看到資料庫中資料的更新清單,而且可以編輯另一個產品。

  6. 儲存網頁。

  7. 執行 EditProducts.cshtml 頁面, (不是更新頁面) ,然後按一下 [ 編輯 ] 以選取要編輯的產品。 UpdateProducts.cshtml頁面隨即顯示,其中顯示您選取的記錄。

    [顯示 [更新產品] 頁面的螢幕擷取畫面,以及選取的記錄。

  8. 進行變更,然後按一下 [ 更新]。 產品清單會隨著更新的資料再次顯示。

刪除資料庫中的資料

本節說明如何讓使用者從 Product 資料庫資料表中刪除產品。 此範例包含兩個頁面。 在第一個頁面中,使用者選取要刪除的記錄。 然後,要刪除的記錄會顯示在第二個頁面中,讓他們確認他們想要刪除記錄。

注意

重要 在生產網站中,您通常會限制誰能夠對資料進行變更。 如需如何設定成員資格以及如何授權使用者在網站上執行工作的詳細資訊,請參閱將安全性和成員資格新增至 ASP.NET Web Pages網站

  1. 在網站中,建立名為 ListProductsForDelete.cshtml 的新 CSHTML檔案。

  2. 以下列專案取代現有的標記:

    @{
      var db = Database.Open("SmallBakery");
      var selectQueryString = "SELECT * FROM Product ORDER BY Name";
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>Delete a Product</title>
        <style>
            table, th, td {
              border: solid 1px #bbbbbb;
              border-collapse: collapse;
              padding: 2px;
            }
         </style>
    </head>
    <body>
      <h1>Delete a Product</h1>
      <form method="post" action="" name="form">
        <table border="1">
          <thead>
            <tr>
              <th>&nbsp;</th>
              <th>Name</th>
              <th>Description</th>
              <th>Price</th>
            </tr>
          </thead>
          <tbody>
            @foreach (var row in db.Query(selectQueryString)) {
              <tr>
                <td><a href="@Href("~/DeleteProduct", row.Id)">Delete</a></td>
                <td>@row.Name</td>
                <td>@row.Description</td>
                <td>@row.Price</td>
              </tr>
            }
          </tbody>
        </table>
      </form>
    </body>
    </html>
    

    此頁面類似于先前的 EditProducts.cshtml 頁面。 不過,它不會顯示每個產品的 [編輯 ] 連結,而是會顯示 [刪除 ] 連結。 刪除連結是使用標記中的下列內嵌程式碼所建立:

    <a href="@Href("~/DeleteProduct", row.Id)">Delete</a>
    

    這會在使用者按一下連結時,建立如下所示的 URL:

    http://<server>/DeleteProduct/4

    URL 會呼叫名為 DeleteProduct.cshtml 的頁面 (,您將在下一個) 建立,並將產品的識別碼傳遞給此處, (4) 。

  3. 儲存檔案,但保持開啟狀態。

  4. 建立另一個名為 DeleteProduct.cshtml 的CHTML 檔案。 以下列內容取代現有的內容:

    @{
      var db = Database.Open("SmallBakery");
      var ProductId = UrlData[0];
      if (ProductId.IsEmpty()) {
        Response.Redirect("~/ListProductsForDelete");
      }
      var prod = db.QuerySingle("SELECT * FROM PRODUCT WHERE ID = @0", ProductId);
      if( IsPost && !ProductId.IsEmpty()) {
        var deleteQueryString = "DELETE FROM Product WHERE Id=@0";
        db.Execute(deleteQueryString, ProductId);
        Response.Redirect("~/ListProductsForDelete");
      }
    }
    
    <!DOCTYPE html>
    <html>
    <head>
        <title>Delete Product</title>
    </head>
    <body>
      <h1>Delete Product - Confirmation</h1>
      <form method="post" action="" name="form">
        <p>Are you sure you want to delete the following product?</p>
    
        <p>Name: @prod.Name <br />
           Description: @prod.Description <br />
           Price: @prod.Price</p>
        <p><input type="submit" value="Delete" /></p>
      </form>
    </body>
    </html>
    

    此頁面是由 ListProductsForDelete.cshtml 呼叫,並可讓使用者確認他們想要刪除產品。 若要列出要刪除的產品,您可以使用下列程式碼,取得要從 URL 中刪除的產品識別碼:

    var ProductId = UrlData[0];
    

    接著,頁面會要求使用者按一下按鈕,以實際刪除記錄。 這是重要的安全性措施:當您在網站中執行敏感性作業,例如更新或刪除資料時,應該一律使用 POST 作業來完成這些作業,而不是 GET 作業。 如果您的網站已設定好,以便使用 GET 作業執行刪除作業,任何人都可以傳遞類似 的 http://<server>/DeleteProduct/4 URL,並從您的資料庫刪除任何想要的專案。 藉由新增確認和撰寫頁面的程式碼,讓刪除只能使用 POST 來執行,即可將安全性量值新增至您的網站。

    實際的刪除作業是使用下列程式碼來執行,它會先確認這是後置作業,而且識別碼不是空的:

    if( IsPost && !ProductId.IsEmpty()) {
        var deleteQueryString = "DELETE FROM Product WHERE Id=@0";
        db.Execute(deleteQueryString, ProductId);
        Response.Redirect("~/ListProductsForDelete");
    }
    

    程式碼會執行 SQL 語句,以刪除指定的記錄,然後將使用者重新導向回清單頁面。

  5. 在瀏覽器中執行 ListProductsForDelete.cshtml

    [顯示瀏覽器中刪除點 CSHTML 的執行清單產品螢幕擷取畫面。]

  6. 按一下其中一個產品的 [刪除] 連結。 [ DeleteProduct.cshtml ] 頁面隨即顯示,以確認您想要刪除該記錄。

  7. 按一下 [刪除] 按鈕。 系統會刪除產品記錄,並使用更新的產品清單重新整理頁面。

提示

連接到資料庫

您可以透過兩種方式連線到資料庫。 第一個方法是使用 Database.Open 方法,並指定資料庫檔案名, (.sdf 副檔名) :

var db = Database.Open("SmallBakery");

方法 Open 假設 為 。sdf 檔案位於網站的 App_Data 資料夾中。 此資料夾專為保存資料而設計。 例如,它具有適當的許可權可讓網站讀取和寫入資料,而且作為安全性措施,WebMatrix 不允許存取此資料夾中的檔案。

第二種方式是使用連接字串。 連線字串包含如何連線到資料庫的相關資訊。 這可以包含檔案路徑,也可以包含本機或遠端伺服器上SQL Server資料庫的名稱,以及連線到該伺服器的使用者名稱和密碼。 (如果您將資料保留在集中管理的 SQL Server 版本中,例如在裝載提供者的網站上,您一律使用連接字串來指定資料庫連線資訊。)

在 WebMatrix 中,連接字串通常會儲存在名為Web.config的 XML 檔案 。如名稱所示,您可以使用網站根目錄中 的Web.config 檔案來儲存月臺的組態資訊,包括您的網站可能需要的任何連接字串。 Web.config檔案中的連接字串範例可能如下所示。 注意 $CREDENTIAL_PLACEHOLDER$ 是密碼金鑰/值組的預留位置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
   <add
     name="SQLServerConnectionString"
     connectionString= "server=myServer;database=myDatabase;uid=username;$CREDENTIAL_PLACEHOLDER$"
     providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

在此範例中,連接字串指向在伺服器上執行之 SQL Server 實例中的資料庫, (而不是本機.sdf檔案) 。 您必須取代 和 myServermyDatabase 的適當名稱,並針對 和 password 指定SQL Server登入值 username 。 (使用者名稱和密碼值不一定與您的 Windows 認證相同,也不一定與您裝載提供者用來登入其伺服器的值相同。請向系統管理員確認您需要的確切值。)

方法 Database.Open 具有彈性,因為它可讓您傳遞資料庫 .sdf 檔案名或 儲存在Web.config 檔案中的連接字串名稱。 下列範例示範如何使用上一個範例所示的連接字串來連線到資料庫:

@{
    var db = Database.Open("SQLServerConnectionString");
}

如前所述, Database.Open 方法可讓您傳遞資料庫名稱或連接字串,並找出要使用的名稱。 當您部署 (發佈) 您的網站時,這非常有用。 當您開發及測試網站時,可以在App_Data資料夾中使用.sdf檔案。 然後,當您將月臺移至生產伺服器時,您可以在與.sdf檔案同名的Web.config檔案中使用連接字串,但指向裝載提供者的資料庫,完全不需要變更程式碼。

最後,如果您想要直接使用連接字串,您可以呼叫 Database.OpenConnectionString 方法並傳遞實際連接字串,而不只是 Web.config 檔案中的名稱。 在某些情況下,您可能會因為某些原因而無法存取連接字串 (或其中的值,例如 .sdf 檔案名) ,直到頁面執行為止。 不過,在大部分案例中,您可以如本文所述使用 Database.Open

其他資源