データを登録する簡単なWebサービス(ASP.NET)

プログラミング系のネタが続きます。今回は、Flickrの写真リスト取得と絡めて、取得した写真リストの情報をデータベースに登録する、簡単なWebサービスを作ってみましょう。

Webサービスには、id, owner, secret, server, farmといった、Flickrの写真表示に必要な情報を渡して、それをデータベースに登録させるものとします。クラス名はFlickrとして、StoreFlickrInfo()といったメソッドにしましょうか。

bool Flickr.StoreFlickrPhoto(string id, string secret, string owner, string farm, string server)

ASP.NETにおけるWebサービスの実装方法については、何を作るにしても同じなので省略します。肝心のメソッドの中身だけ、書いていくことにします。

さて、データベースへの登録ですが、もっともシンプルかつ基本的であるとして、SqlConnectionクラスを使ってみることにしました。今では、LINQ to SQLやLINK to Entityといった便利なものもあるのですが、私自身がよくわかっていないので、今さらながら基本といきます。

SqlConnectionクラスを使う場合、最初に必要なのは、接続文字列です。接続文字列はハードコーディングしてもよいのですが、通常はweb.configから取得します。

ConnectionStringSettingsCollection connectionStrings = ConfigurationManager.ConnectionStrings;
string connectionstring = connectionStrings["ConnectionString"].ConnectionString);

ここでは、接続文字列の名前が「ConnectionString」であるものとして取得しています。

実は、ここではまりました。web.configには接続文字列は1個しか定義されていないので、connectionStringsの0番目の要素を取ればいいかと思っていましたら、失敗しました。内部的に作成されている接続文字列もあるようなので、必ず名前で取得しましょう。

次に、connectionstringを用いて、SqlConnectionオブジェクトを生成します。できればこれはUsing句で囲み、例外処理を自動化させた方がスッキリします。

SqlConnection connection = new SqlConnection(connectionstring);

接続を開いて、PhotoDBオブジェクトを初期化します。PhotoDBオブジェクトは、写真に関するデータを一時的に保持するテーブルのようなものだと思って下さい。photo_idメンバは写真データのIDであり、これを0にしているのは既登録の確認のためだと思って下さい。

connection.Open();
PhotoDB db = new PhotoDB();
db.photo_id = 0;

データベースへ登録するためのSQL文には、SqlCommandクラスを用います。SqlCommandオブジェクトを使い回したいので、単純に生成し、プロパティに必要な命令文などを与えていくことにします(生成時にも指定できます)。

SqlCommand command = new SqlCommand();
string command_text;
command_text = "SELECT * FROM FlickrPhoto WHERE id='{0}'";
command.Connection = connection;
command.CommandText = string.Format(command_text, id);

SQL文がSELECTの場合は、ExecuteReaderメソッドを実行してSqlDataReaderオブジェクトを取得します。テーブルの構造は、以下のコードからだいたい読み取って下さい。

SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
        db.photo_id = Int32.Parse( reader["photo_id"].ToString() );
        db.id = reader["id"].ToString();
        db.owner = reader["owner"].ToString();
        db.secret = reader["secret"].ToString();
        db.server = reader["server"].ToString();
        db.farm = reader["farm"].ToString();
}

実行を終えたら、SqlDataReaderオブジェクトは廃棄します。

reader.Close();

db.photo_idが0の場合は登録されていないということなので、追加処理を行います。SQL文がINSERTコマンドの場合には、ExecuteNonQueryメソッドになります。

if (db.photo_id == 0)
{
    command_text = "INSERT INTO FlickrPhoto(id, owner, secret, server, farm) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}')";
    command.CommandText = string.Format(command_text, id, owner, secret, server, farm);
    command.ExecuteNonQuery();
}

処理が終われば、接続をクローズします。

connection.Close();

これで終わりです。

更新処理を行うとか、ほかにもデータを登録する(たとえばExifデータなど)場合には、もっと複雑なコードになりますが、基本はこんなところでしょう。

SELECTコマンドやINSERTコマンドを実行するあたりはLINQを使えばもっとシンプルになりそうですが、それはそのうち勉強してからということで…。

コメント