[Windows Azure][IT鐵人賽系列] Day 27 - SQL Azure Application Development

SQL Azure的資料庫應用程式開發和SQL Server有95%以上可相容,剩下的5%只要修改一下SQL,將不支援的指令移除後,一樣能連接SQL Azure。

SQL Azure的資料庫應用程式開發和SQL Server有95%以上可相容,剩下的5%只要修改一下SQL,將不支援的指令移除後,一樣能連接SQL Azure。

連接SQL Azure的方式與SQL Server差不多,要連接SQL Azure資料庫,只要改寫好連線字串即可。在建立SQL Azure伺服器的時候,就會決定好伺服器的名稱,通常會是 [server_name].database.windows.net([server_name]是由SQL Azure決定的伺服器配置識別字串),而SQL Azure也只支援SQL驗證模式,因此只要注意在連線字串中要多加一個Encrypt=true即可。在SQL Azure管理介面中,也提供了可以讓開發人員檢視的連線字串設定。

clip_image002[4]

唯一和一般連線伺服器不同的是使用者名稱的設定,在以往的SQL Server連線中,使用者名稱是直接給定即可,但SQL Azure Server的使用者名稱是username@servername,例如要用使用者名稱login_sqlazure連到t1234567的SQL Azure Server時,使用者名稱要設定為login_sqlazure@t1234567,密碼則是該帳戶的密碼(在連線字串提示中的myPassword要代換為該帳戶的密碼)。下列字串即是連接SQL Azure Server的範例字串(data source, user id和password都是虛構的,您要依自己的環境修改):

data source=t1234567.database.windows.net;user id=login_sqlazure@t1234567;password=P112@ddqABC;Encrypt=True;Trusted_Connection=False

由於現階段SQL Azure資料庫的定序(Collation)固定都設定為SQL_LATIN1_GENERAL_CP1_CI_AS,即美國的語系,因此當利用SQL指令輸入中文資料時會被寫入成亂碼,若要解決這個問題,可以在資料值前面加入N巨集,讓SQL Server以Unicode方式寫入資料庫。或是修改表格的COLLATE編碼設定為中文編碼。但如果是用參數化查詢(Parameterized Statement),就可以不用做這件事,因為SQL Server Client Library就會自動將它做完。順道一提,如果要讓N巨集發揮作用,資料表欄位的資料型別必須要支援Unicode,亦即要使用”n”開頭的字串型別,例如nchar、nvarchar、ntext等。

INSERT INTO myTable VALUES (N'中文字')

應用程式存取SQL Azure的部署模式有三種,第一種是由外部直接存取到SQL Azure資料庫,適用於Windows Forms或WPF等應用程式,優點是直接且容易修改,但缺點就是安全問題,以及如果剛好用戶端不在防火牆開放之列就無法存取,若將防火牆完全開放(0.0.0.0-255.255.255.255)又不符合安全的標準規範。第二種是透過外部的中間層(middle tier)存取SQL Azure,例如透過WCF或HTTP Service來連接SQL Azure,適用於Web或是小型用戶端(如Windows Phone Client),優點是SQL Azure的資料消費者只有WCF, Web或HTTP Service,但是缺點是無法提供太多查詢空間,要視中間層的設計決定。第三種則是將應用程式或中間層移到雲端機房內,適用於Web或中間層的應用程式,優點是防火牆只要打開給雲端應用程式使用即可,較前兩種安全,但缺點則是應用程式必須改寫成Web應用程式,對既有的Windows Forms或WPF應用程式來說負擔較大,而且也會有中間層的缺點出現。

image

應用程式可以利用ADO.NET以及ODBC來連接與存取SQL Azure資料庫,意味著傳統的System.Data.SqlClient命名空間以及System.Data.Odbc命名空間都可以繼續使用,當然Entity Framework也在支援之列,只要掌握好連線字串的設定方式,就可以很快的將應用程式的連接移轉到SQL Azure上。

最後,筆者要說明幾個應用程式存取時的注意事項:

  • 連線不要開啟太久,Gateway會偵測連線的存活時間,如果太久的話會由Gateway自動切斷,預設的時間是300秒(5分鐘)。閒置時間最長則是30分鐘。同時也有可能會因為伺服器切換或是其他可能的系統因素而導致連線突然中斷。若應用程式預期會有這樣的情況時,必須要處理相關的Exception。
  • 查詢請務必使用Parameterized Statement方式,以避免被攻擊,同時使用Parameterized Statement,也可以將參數型別轉換與語系的處理交給SQL Server的Client Library做,一舉數得。
  • .NET Framework的版本必須要3.5以上(TDS協定的版本是7.3),而PHP所用的SQL Server Driver則要1.1版以上,Java用的JDBC Driver則需要3.0版以上。
  • SQL Azure支援快照式隔離模式(Snapshot Isolation Mode),但不支援分散式交易,同時若有多個交易,必須要在同一條連線內完成,否則SQL Azure如果發現連線關閉時交易未完成認可(commit)時會強制撤回(rollback)。
  • 資料表必須要至少一個叢集式索引(Clustered Index),否則無法存取,在建立時也會出現警告。

 

Reference:

http://msdn.microsoft.com/zh-tw/library/ee621787.aspx

http://msdn.microsoft.com/zh-tw/library/ee730903.aspx