連絡ボックスとは、弊社が開発する、業務用の情報共有ツールです。

最大の特徴は、なんといっても「Windows Azure Platform」を活用していることです!

「Azure ブログ」の技術を、余すところなく詰め込みました。

ぜひ、紹介ページにお立ち寄りください!

連絡ボックス

 

image

 

ここからは、おまけです。

 

「連絡ボックス」のテストを行っていると、データを一括して直接更新したいことが、たまにあります。

SQL Azureは、SQLなので問題はないのですが、問題はTABLEストレージです。

一行の更新なら「Azure Storage Explorer」などで問題はないのですが、数百、数千、数万となると……

Azure Storage Explorer

コンソールアプリなら、一気に更新できると思い、調べると、MSDNにサンプルがありました。

コードのクイック スタート: ファイルを Windows Azure ストレージに保存するアプリケーションの作成

残念ながら、BLOBストレージ用だったので、TABLEストレージ用に変更しました。

実行したところ……

 

「コンテキストは現在エンティティを追跡していません。」

 

意味の分からんエラーがキターッ!

image

ここから私は迷走しました。

(ちなみにここから無駄に長いです。エラーメッセージをググって来られた方は、最後の方を見てください)

色々あって、プログラミングから距離を置いていた私は、久しぶりだから、何かが古いのではと思ってしまいました。

迷走するうちに、下記に「Web Platform Installer 3.0」にたどり着き、勢いで更新すると……

http://www.microsoft.com/web/gallery/install.aspx?appid=WindowsAzureToolsVS2010

image

色々なものが、モリモリ入っていき……

image

入っていき……

image

何か知らないうちに「v1.6」になってしまいました。

image

結局、SDKのバージョンは、全く関係ありませんでした。

なんだかんだで、本を見たら……

Windows Azureアプリケーション開発入門 第2版 (MSDNプログラミングシリーズ)

 

テーブルにアクセスするためのエンティティの定義で、「TableServiceEntity」を継承していませんでした。

 

完全に忘れてた……

下記の「Inherits TableServiceEntity」です。

コードを置いておきます。

(色々と省きましたので、詳細はMSDNのサンプルをご覧ください)

Imports Microsoft.WindowsAzure
Imports Microsoft.WindowsAzure.StorageClient
 
Public Class MessageBody
    Inherits TableServiceEntity
 
    Public Property Body As String
    Public Property CryptographID As Integer
    Public Property Subject As String
 
    Public Sub New()
        MyBase.New()
    End Sub
 
    Public Sub New(ByVal partitionKey As String, ByVal rowKey As String)
        MyBase.New(partitionKey, rowKey)
    End Sub
 
    Public Sub New(ByVal partitionKey As String, ByVal rowKey As String, ByVal timestamp As Date, ByVal body As String, ByVal cryptographID As String, ByVal subject As String)
        MyBase.New(partitionKey, rowKey)
        Me.Timestamp = timestamp
        Me.Body = body
        Me.CryptographID = cryptographID
        Me.Subject = subject
    End Sub
 
End Class
 
Module Module1
 
    Sub Main()
 
        Dim account As CloudStorageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=http;AccountName=your_storage_account_name;AccountKey=your_storage_account_key")
        Dim tableClient As CloudTableClient = account.CreateCloudTableClient()
        Dim context As TableServiceContext = tableClient.GetDataServiceContext
 
        Console.WriteLine("開始")
        Console.ReadLine()
 
        Dim query = From r In context.CreateQuery(Of MessageBody)("MessageBody")
 
        ' 表示
        For Each row In query
            Console.WriteLine(row.RowKey)
        Next
 
        ' 更新(RowKeyは更新できないかった……)
        Console.WriteLine("更新")
        Console.ReadLine()
 
        For Each row In query
 
            ' 更新
            Mid(row.RowKey, 17, 1) = "1"
            Console.WriteLine(row.RowKey)
            context.UpdateObject(row)
 
         Next
 
        ' 削除
        Console.WriteLine("削除")
        Console.ReadLine()
 
        For Each row In query
 
            If Mid(row.RowKey, 17, 1) = "1" Then
 
                Console.WriteLine(row.RowKey)
                context.DeleteObject(row)
 
            End If
 
        Next
 
        context.SaveChanges()
 
        ' 追加
        Console.WriteLine("追加")
        Console.ReadLine()
 
      
        For Each row In query
 
            Dim newRowKey As String = row.RowKey
            Mid(newRowKey, 17, 1) = "1"
 
            Dim newRow As New MessageBody(row.PartitionKey, newRowKey, row.Timestamp, row.Body, row.CryptographID, row.Subject)
 
            Console.WriteLine(newRow.RowKey)
            context.AddObject("MessageBody", newRow)
 
            context.SaveChanges()
 
        Next
 
        ' まとめてやると、エラーになった
        'context.SaveChanges()
 
        Console.WriteLine("終了")
        Console.ReadLine()
 
    End Sub
 
End Module
 

 

それでは、「連絡ボックス」をよろしくお願いいたします。