わんくま同盟 大阪勉強会 #35 で SQL Azure の話をしました

わんくま同盟 大阪勉強会 #35 で SQL Azure の話をします - お だ のスペース で書いた通り、セッションしました。
色々とグダグダで朝一から見に来ていただいた方々には申し訳ありませんでした。
ただ、個別に質問しに来ていただいた方もおられましたので、少しは興味を持っていただけたのかなと思っています。
セッション資料は、勉強会のサイトでも公開されると思いますが、こちらでも公開しておきます。
SQL Azure(あじゅーる)しってますか?.pptx
Power Point 2007 形式です。PowerPoint なんて持ってないよって方は、Office Web Apps で見れますよ。


ここで、セッション中に詳しくお話し出来なかった事や、後で質問された事について補足しておきます。

接続文字列を変更するだけで大丈夫です。と言いましたが…

General Guidelines and Limitations (Windows Azure SQL Database) より引用。

When writing applications for SQL Azure, you can use the following drivers and libraries:
.NET Framework Data Provider for SQL Server (System.Data.SqlClient) from the .NET Framework 3.5 Service Pack 1.
SQL Server 2008 Native Client ODBC driver. 
SQL Server 2008 Driver for PHP version 1.1. 
SQL Azure supports tabular data stream (TDS) protocol client version 7.3 or later. Earlier versions of TDS protocol are not supported. 
Connecting to SQL Azure by using OLE DB is not supported.

.NET Framework 3.5 SP1 じゃないとダメかもしれないので、試してみました。
XP SP3 に We are sorry, the page you requested cannot be found. をインストールした環境で試してみたところ問題無く動作しました。ので、.NET 2.0 だけの環境でも問題なさそうです。

サンプルコード

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Transactions;

namespace SqlAzureDemo1
{
  class Program
  {
    static void Main(string[] args)
    {
      Select();
      Insert(false);
      Select();
      Insert(true);
      Select();

      Console.ReadKey();
    }
    private static string GetConnectionString()
    {
      // 各自の環境に合わせてください。
      return @"Data Source=<serverName>.database.windows.net;Initial Catalog=<dataBaseName>;User ID=<userName>;Password=<password>";
    }
    static void Select()
    {
      using (var conn = new SqlConnection(GetConnectionString()))
      using (var cmd = new SqlCommand(@"
SELECT 
  [Id], [Name], [EntryDate] 
FROM 
  [Table_1] 
", conn))
      {
        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
          while (reader.Read())
          {
            Console.WriteLine(String.Format("Id:{0} Name:{1} EntryDate:{2}",
                reader["Id"], reader["Name"], reader["EntryDate"]));
          }
        }
      }
    }
    static void Insert(bool isCommit)
    {
      using (var conn = new SqlConnection(GetConnectionString()))
      using (var cmd = new SqlCommand(@"
INSERT INTO [Table_1] ( 
  [Name], [EntryDate] 
) VALUES ( 
  @name, @entryDate 
) 
", conn))
      {
        cmd.Parameters.Add(new SqlParameter("@name", System.Data.SqlDbType.NVarChar));
        cmd.Parameters.Add(new SqlParameter("@entryDate", System.Data.SqlDbType.DateTime));
        using (var tran = new TransactionScope())
        {
          conn.Open();
          for (int i = 0; i < 10; i++)
          {
            cmd.Parameters[0].Value = string.Format("Name{0}", i);
            cmd.Parameters[1].Value = DateTime.Now.AddDays(i);
            cmd.ExecuteNonQuery();
          }
          if (isCommit)
          {
            tran.Complete();
          }
        }
      }
    }
  }
}
  • JDBC で接続出来るよ

JDBCドライバは、MS が提供している マイクロソフト公式ダウンロード センターから Microsoft SQL Server JDBC Driver 2.0 をダウンロード を使用します。
コードのサンプルは、以前書いたこちらを参考に。Groovy から SQL Azure に JDBC で接続してみた - お だ のスペース

  • 照合順序の話

SQL Server では、サーバー、DB、列、式 単位で照合順序を指定出来ますが、SQL Azure では、列、式 単位でしか指定出来ません。
MSDN SQL Server オンライン ブック 照合順序の設定と変更
General Guidelines and Limitations (Windows Azure SQL Database)

General Guidelines and Limitations (Windows Azure SQL Database) から引用

SQL Server Collation Support 
The default database collation used by SQL Azure Database is SQL_LATIN1_GENERAL_CP1_CI_AS, where LATIN1_GENERAL is English (United States), CP1 is code page 1252, CI is case-insensitive, and AS is accent-sensitive.

When using an on-premise SQL Server, you can set collations at server, database, column, and expression levels. SQL Azure does not allow setting the collation at the server or database level. To use the non-default collation with SQL Azure, set the collation at the column level or the expression level. For more information about how to set the collation, see COLLATE (Transact-SQL) in SQL Server Books Online.

なので、面倒ですが日本語を含むカラムには、COLLATE で照合順序を指定してあげるか、NCHAR、NVARCHAR を使うのが良さそうです。
サンプルクエリと実行結果

サンプルクエリ

CREATE TABLE [Test] ( 
  [Id] INT IDENTITY(1,1) PRIMARY KEY, 
  [VARCHAR指定無] VARCHAR(MAX), 
  [VARCHAR指定有] VARCHAR(MAX) COLLATE Japanese_BIN2, 
  [NVARCHAR指定無] NVARCHAR(MAX), 
  [NVARCHAR指定有] NVARCHAR(MAX) COLLATE Japanese_BIN2
) 

INSERT INTO [Test] VALUES (N'あいう', N'あいう', N'あいう', N'あいう')
SELECT * FROM [Test]
DROP TABLE [Test]

これは、以前 SQL Server 2008 R2 & SQL AZureミーティング - braitomの日記 を見て知りました。
実際試してみたところ繋がったので、デモで紹介しようと思っていたのですが時間切れ…。


ここからは、質問についての回答です。

  • ハードウェア障害に備えて自動複製機能があるけど、どうやって実現してるの?

自動複製機能については、PDC09 のスライド P-12 に載っています。
SQL Azure Database: Present and Future :: Sessions :: Microsoft PDC10 | October 28 — 29
が、実現方法については、Windows Azureアプリケーション開発入門 (MSDNプログラミングシリーズ) の P.60-61 を読んで下さい。。
これ公式の情報源を見つけられませんでした。*1

  • 日本語のテーブル名やカラム名は使えるの?

私も日本語使用を推している方ですが、質問される迄試すの忘れてました。
上のサンプルクエリ内でも日本語カラム名を使用している通り、問題無く使えました。テーブル名についても日本語使用OKです。

*1:単に英語が読めないだけかも…