共用方式為


在 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。 您可以使用 ASP.NET Web Pages 3 和 Visual Studio 2013 (或 Visual Studio Express 2013 for Web):但使用者介面有所不同。

資料庫簡介

設想典型的通訊錄。 對於通訊錄中的每個項目 (即每個人),您會有幾項資訊,例如名字、姓氏、地址、電子郵件地址和電話號碼。

以資料列和資料行顯示這類資料的一般方式稱為資料表。 就資料庫而言,每一資料列通常稱為記錄。 每一資料行 (有時稱為欄位) 都包含每種資料類型的值:名字、姓氏等。

識別碼 FirstName LastName 地址 Email 手機
1 Jim Abrus 210 100th St SE Orcas WA 98031 jim@contoso.com 555 0100
2 Terry Adams 1234 Main 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 Matrix 開啟資料表設計工具。]

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

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

  9. 將 [主索引鍵?] 和 [識別碼?] 選項設定為 [是]

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

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

  11. 對於 Name 值,輸入 "Name"。

  12. 針對 [資料類型],選擇 [nvarchar],並將長度設定為 50。 var 部分 (屬於 nvarchar) 會告訴資料庫,此資料行的資料會是字串,其大小可能會因記錄而異。 (n 前置詞代表 national,表示欄位可以儲存代表任何字母或寫入系統的字元資料,也就是說,欄位會儲存 Unicode 資料。

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

  14. 使用相同的程序,建立名為 Description 的資料行。 將 [資料類型] 設定為 "nvarchar",50 代表長度,並將 [允許 Null] 設定為 false。

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

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

    完成之後,該定義外觀如下:

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

  17. 按 CTRL+S 以儲存資料表。

將資料新增至資料庫

現在,您可以將一些範例資料新增至您的資料庫,本文稍後將會用到。

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

  2. 以右鍵按一下 Product 資料表,然後按下 Data

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

    名稱 說明 Price
    麵包 每天烘焙新鮮麵包。 2.99
    草莓酥餅 從我們花園的有機草莓製成。 9.99
    蘋果派 僅次於有媽媽味道的餡餅。 12.99
    胡桃派 如果您喜歡山核桃,這就是您的了。 10.99
    檸檬派 用世界上最優質的檸檬製成。 11.99
    杯子蛋糕 您的小孩和您內心的小孩會喜歡這些。 7.99

    請記住,您不需要在 Id 資料行輸入任何資料。 當您建立 Id 資料行時,您會將其 [為身分識別] 屬性設定為 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 資料行值,依字母順序排序。

    在頁面主體中,標記會建立用來顯示資料的 HTML 資料表。 在 <tbody> 元素內 ,您可以使用 foreach 循環以個別取得查詢所傳回的每個資料列。 針對每個資料列,您會建立 HTML 資料表資料列 (<tr> 元素)。 然後,您會為每個資料行建立 HTML 資料儲存格 (<td> 元素)。 每次執行循環時,資料庫的下一個可用資料列會位於 row 變數中 (在 foreach 陳述式中設定此項)。 若要從資料列取得個別資料行,您可以使用 row.Namerow.Description 或您想要的任何資料行名稱。

  4. 在瀏覽器中執行頁面。 (確保在您執行工作區之前,已先在檔案工作區中選取頁面。) 頁面顯示的清單如下所示:

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

提示

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

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

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

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

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

這會在Product 資料表中插入新記錄,將 Name 資料行設定為 “Croissant”、將 Description 資料行設定為 “A flaky delight”,並將價格設定為 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)";
    

    若要插入值,可以包含參數預留位置 (@0@1@2)。

    注意

    基於安全性預防措施,請一律使用參數將值傳遞至 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 參數中所傳遞之值的產品。 (因為 Id 是主索引鍵,因此必須是唯一的,而且也只能以這種方式選取一筆產品記錄。若要取得要傳遞至此 Select 陳述式的 ID 值,您可以使用下列陳述式,讀取傳遞至頁面以做為 URL 一部分的值:

    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等來指定值。 (如先前所述,基於安全考量,您應該一律使用參數將值傳遞至 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 執行刪除,您可以將安全測量值新增至您的網站。

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

    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 取代為適當的名稱,並針對 usernamepassword 指定 SQL Server 登入值。 (使用者名稱和密碼值不一定與您的 Windows 認證相同,也不一定與您的代管服務提供者用來登入其伺服器的值相同。請與系統管理員確認以取得您需要的正確值)。

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

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

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

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

其他資源