標籤:blog http os io 使用 strong ar for 檔案
本文轉自:http://blogs.msdn.com/b/azchina/archive/2010/03/11/windows-azure-table-storage.aspx
本文是Windows Azure入門教學的第六篇文章。
本文將會介紹如何使用Table Storage。Table Storage提供給我們一個雲端的表格結構。我們可以把他想象為XML檔案或者是一個輕量級的資料庫(當然,不是通過SQL 語句進行資料的操作)。
使用Table Storage的方法依然是調用REST API。有關Table Storage REST API的詳細資料,請參見Table服務API:
為了方便.NET開發人員,我們在SDK中提供了Microsoft.WindowsAzure.StorageClient類來協助發送REST請求。
在開始本教學之前,請確保你從Windows Azure 平台下載下載並安裝了最新的Windows Azure開發工具。本教學使用Visual Studio 2010作為開發工具。
步驟一:建立解決方案和項目
由於我們要在本地類比環境下測試Table Storage,首先,請確保Storage Emulator已經啟動。我們可以找到管理器的進程手動啟動或者讓Visual Studio 2010協助我們啟動他。
右擊工具列中Windows Azure模擬器的表徵圖,選擇”Show Storage Emulator UI”。彈出如所示的視窗:
我們要關注的是Service management中Table所在的一行。要確保Status為Running。
確認完畢後啟動Visual Studio 2010,並且建立一個Console項目。
步驟二:添加程式集引用
請在項目屬性頁面裡確認項目的Target framework的值是.NET Framework 4或.NET Framework 3.5。然後添加對C:\Program Files\Windows Azure SDK\v1.3\ref\Microsoft.WindowsAzure.StorageClient.dll的引用。該路徑為SDK預設安裝路徑,如果你不能在這個路徑中找到Microsoft.WindowsAzure.StorageClient.dll請從SDK安裝路徑中尋找。
接下來添加對System.Data.Services.Client程式集的引用。該程式集安裝在GAC中。你能夠在Add Reference視窗的.NET標籤下找到他。
步驟三:添加代碼
首先在項目中的Program.cs中引用命名空間:
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
然後在Program.cs中添加如下代碼:
class Program
{
static void Main(string[] args)
{
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var tableStorage = storageAccount.CreateCloudTableClient();
// 檢查名為CustomerInfo的表格是否被建立,如果沒有,建立它
tableStorage.CreateTableIfNotExist("CustomerInfo");
// 建立表格服務上下文
var context = new CustomerInfoContext(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials);
// 插入兩條客戶資訊資料,客戶ID分別設定為0和1
CustomerInfo ci1 = new CustomerInfo() { CustomerAge = 25, CustomerID = "0", CustomerName = "Mike" };
context.AddObject("CustomerInfo", ci1);
CustomerInfo ci2 = new CustomerInfo() { CustomerAge = 32, CustomerID = "1", CustomerName = "Peter" };
context.AddObject("CustomerInfo", ci2);
context.SaveChanges();
// 尋找CustomerID為1的客戶資料並顯示
Console.WriteLine("Retrieve information of a customer whose ID is 1");
var query = context.CreateQuery<CustomerInfo>("CustomerInfo").Where(c => c.CustomerID == "1").ToList();
var returnedcustomerinfo = query.FirstOrDefault();
Console.WriteLine(string.Format("Customer info retrieved: ID:{0},Name:{1},Age:{2}",
returnedcustomerinfo.CustomerID, returnedcustomerinfo.CustomerName, returnedcustomerinfo.CustomerAge));
// 更新CustomerID為1的客戶資料中的年齡
returnedcustomerinfo.CustomerAge = 33;
context.UpdateObject(returnedcustomerinfo);
Console.WriteLine("**Customer Info updated**");
// 重新查詢,測試更新效果
Console.WriteLine("Retrieve information of a customer whose ID is 1");
var query2 = context.CreateQuery<CustomerInfo>("CustomerInfo").Where(c => c.CustomerID == "1").ToList();
var returnedcustomerinfo2 = query.FirstOrDefault();
Console.WriteLine(string.Format("Customer info retrieved: ID:{0},Name:{1},Age:{2}",
returnedcustomerinfo2.CustomerID, returnedcustomerinfo2.CustomerName, returnedcustomerinfo2.CustomerAge));
// 刪除插入的兩條客戶資料
context.DeleteObject(ci1);
context.DeleteObject(ci2);
context.SaveChanges();
Console.WriteLine("The records has been deleted");
Console.ReadLine();
}
}
public class CustomerInfo : TableServiceEntity
{
public string CustomerID
{
get { return this.RowKey; }
set { this.RowKey = value; }
}
public string CustomerName { get; set; }
public int CustomerAge { get; set; }
public CustomerInfo()
{
this.PartitionKey = "mypartitionkey";
}
}
public class CustomerInfoContext : TableServiceContext
{
public CustomerInfoContext(string baseAddress, StorageCredentials credentials) :
base(baseAddress, credentials)
{
}
}
步驟四:觀察並分析代碼
步驟三中的代碼中,首先我們通過CloudStorageAccount.DevelopmentStorageAccount來說明我們使用的本地的Development Storage內建賬戶而不是真正的雲端儲存服務賬戶。(如果要用真實賬戶可以使用
//DefaultEndpointsProtocol=https可以改成DefaultEndpointsProtocol=http表示用HTTP而不是HTTPS
CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=[使用者名稱];AccountKey=[密碼]");
來執行個體化對象)然後通過該賬戶類來執行個體化一個Table用戶端類。這兩步是使用SDK中StorageClient程式集來調用Table Storage服務的必要步驟。
然後我們需要關注System.Data.Services.Client程式集。該程式集是WCF Data Services的用戶端程式集,能夠協助我們很方便地建立OData用戶端程式。(Table Storage提供的REST API遵循OData規範,因此我們的用戶端需要遵循OData規範向Table Storage服務發送訊息)
我們需要建立上下文來調用服務,我們可以直接使用TableServiceContext。但是通常我們會通過寫一個繼承自TableServiceContext的類來實現,這樣我們可以在該類中添加一些屬性或者方法來更加方便地調用。上面的代碼中我們繼承了TableServiceContext但是並沒有添加額外的代碼。在實際應用中我們可以加上一些代碼來更加方便地調用。比如我們可以在CustomerInfoContext 類中加入下??的屬性:
public IQueryable<CustomerInfo> CustomerInfo
{
get
{
return CreateQuery<CustomerInfo>("CustomerInfo");
}
}
這樣我們就可以通過調用context.CustomerInfo來更加代替context.CreateQuery<CustomerInfo>("CustomerInfo")。
繼承自TableServiceEntity類的CustomerInfo 類定義了每條資料的模式。需要注意的是,與一般的關係型資料庫不同,Table Storage並不要求一個表中的所有資料都遵循同一模式。舉例來說,在一個表中,可以儲存一條有三個欄位的記錄和一條只有兩個欄位的記錄。這也是我們為什麼說可以把Table Storage想象為XML檔案的原因。當然在通常情況下我們都會需要在一個表中儲存同一模式的資料。這時候我們就可以使用System.Data.Services.Client程式集來為Table Storage建立用戶端程式。當我們需要在一個表中儲存不同模式的資料時我們可以手動構建和發送REST請求。
還有需要注意的地方是PartitionKey和RowKey。這兩項共同組合成表的主鍵。詳細資料,請參見理解Table服務資料模型。
代碼邏輯包括了對Table Storage的插入,更新,刪除和讀取。請參考注釋部分。
步驟五:運行程式
如果一切正常,你將會看到Console程式輸出如下資訊:
[轉]Windows Azure入門教學系列 (六):使用Table Storage