非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

C#: Excelをデータベースのように扱う上での問題点

   

前回までのブログは、Excelファイルをあたかもデータベースのように振る舞わせる方法について書きました。

C#でExcelファイルをデータベースのようにSQL構文で読込む方法

C#でExcelファイルをデータベースのようにSQL構文で書き込む方法

 

Excelをデータベースのように扱えるという点では便利なのですが、SQL構文すべて対応しているわけではなく、やはり機能に制限があります。今回はそれについて紹介します。

[ad#top-1]

空欄行化しやすい。

Accessのようなデータベースの場合、INSERT文でデータを追加すると最終行にデータが追加されます。Excelも同じなのですが、もしExcel上で手作業でデータを削除した場合、空欄行と見なされず、その後にINSERTしてもその行を飛ばしてしまう、という問題があります。

例えば、下の図のように6行目の「池田 三郎」さんのデータをExcel上で削除したとします。

次に、

DbCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO [Sheet1$](名前, 年齢)VALUES('池田 三郎', 45)";
command.ExecuteNonQuery();

 

とやると、6行目に追加されるかと思いきや・・・、

なんと、7行目に追加されてしまうのです。削除した6行目は削除したように見えて空白のデータが入っていると見なされてしまうようです。

空白行をWHERE句で捕まえられない

じゃあ、空白行があればそこにUPDATEしてしまえば良いだろうと思いますが、なんと空白行はWHEREで捕まえることができないのです。WHERE 名前=” も、WHERE 名前=NULL もダメ。引っかかりません。

 

DELETE文が使えない

それじゃあ、空欄行を削除してしまうという手がありますが、実はExcelデータベースではDELETE文が使えないのです。おそらく、Excel上の機能の行削除を意味するのですが、SQL文で行削除まではヘビーなのでしょうか。

・・・ということで空欄行が現れたら今のところ指を加えて見ていくしかないということになりますが、何か良い方法を検討していきます。

 

行数に限界がある

データベースなら行数に理論上限界はありませんが、Excelには限りがあります。2003以下は65,536行まで、2010なら1,048,576行までが限界です。行数を常に監視しておく必要があり、あるところでデータのバックアップ+削除という作業が必要になっていくでしょう。

 

JOIN句が使えない

JOIN句に限らず複雑なSQL文は使えないとみていいでしょう。実際に実行させると例外が発生します。複数のExcelシートをつなぎ合わせることができたら面白かったんですが、やはり難しいんですかね。

DELETE文に続きJOIN句も使えないとは相当制約がありますね。せめてJOIN句が使えたら使える幅も広がるのですが・・・。

 

とても便利な機能なのですが、一長一短あります。

[ad#ad-1]

スポンサーリンク

 - C#応用編, Excel