プログラミング系のネタが続きます。今回は、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を使えばもっとシンプルになりそうですが、それはそのうち勉強してからということで…。
コメント