.Netアプリで階層構造のマスタを扱うことになったため、あれこれ探していたら、どうやらSQLServer2008からはhierarcyid型という階層構造を使える型があることを知った


これは素晴らしい、とさっそく該当マスタテーブルにhierarcyid型を作成し、作ってみた
なお、作り方よくわからなかったので、


http://blogs.wankuma.com/kaya/archive/2008/03/19/128582.aspx

ここを参考にした


実際は.Netアプリ上で、その階層構造をTreeViewで表示しようと考える。よくありがちです。
さて、どこかにサンプルはないかとさまよっていたら素晴らしいものを発見


Loading a TreeView using HierarchyID
http://www.codeproject.com/Articles/37038/Loading-a-TreeView-using-HierarchyID


そのまんまでした。
一応DLしてみたところ動きます。ただ、このサンプルはXMLデータから取得していましたが、私が作りたかったのはSQLServerからのテーブルデータだったのでちょっと変更をすることに


hierarcyid型を持つテーブルをWebサービス上のDatasetとして作成し、.Netアプリから呼び出し、dataset→datatableに変換→Treeview格納
という流れのアプリなもので、単純にデータ元を変えようと思ったんですが、ちょっとはまった


以下はサンプルソースを修正していて出たトラブル


1.EnumerableRowCollection(Of DataRow) が未定義になる
→System.Data.DataSetExtensionsを参照設定にいれていなかったため

なお、Microsoft.SqlServer.Typesも参照設定にいれないといけません


2.SqlHierarchyIdへのキャストに失敗する

どういうことかというと
//filter the table using linq. See blog for equals()/== issue
EnumerableRowCollection<DataRow> query =
from TNodes in oTable.AsEnumerable()
where TNodes.Field<SqlHierarchyId>
(sKeyField).GetAncestor(1).Equals(iID)
select TNodes


この部分の、

TNodes.Field<SqlHierarchyId>
(sKeyField).GetAncestor(1).Equals(iID)

がSqlHierarchyIdにキャストできないといわれる
よく見ると、xsdファイル…つまりDataSetのDatatypeがStringになっていた
もとはSqlHierarchyIdの型のはずなんだが、.NetのWebサービス上ではStringになるようだ

よく考えたらそりゃそうか。SOAPで、独自の型使うDataSetにはされないってことなんだな
hierarcyid型はSQLServer独自の型だから自動的にStringに変換されるという認識でよいのだろうか

データ取得元のテーブルの状態で、Stringになってるんだから、これを再度hierarcyid型に変換しないといけない


Webサービスからとってきたデータテーブルを


Dim dummyTable As DataTable = dt.Clone()
dummyTable.Columns("testHierarchyid").DataType = GetType(SqlHierarchyId)

という形でクローンテーブルにコピーした後、SqlHierarchyId.Parseを使ってclone側のテーブルにデータを
うつす必要があった

なお、一括でStreamなどに移してコピーしようとしたけど失敗した。やっぱSqlHierarchyId型はいろいろ難しい…



上記を修正したら、とりあえずTreeViewにテーブルの内容は表示されました。

が……これ、追加更新して、SQLServerに戻すのってどうやんの。

世間のサンプルはどれもこれも直接SQLでの書き込み更新ばっかりで、.Net上でTableAdapterとか介してWebサービス経由でデータを送るようなサンプルがない

.Net上からのSQLを書かないSQLServerへのHierarchyID型テーブル書き込みをこれから調べないとorz


どこかに情報ないかなあ

すごく久しぶりのブログということは、そんなに悩むほど開発してなかったということである…・°・(ノД`)・°・


テスト用のSQLSERVERを組み立て、繋がらなかった。接続しようとすると

「ユーザー’XXX'は接続できませんでした」

と出る。

今さら、アホみたいな内容だが数時間はまったので…


ODBCの接続とかでこのエラーが出た場合は、まずはSQLSERVERのログを見る


「指定された名前に一致するログインがみつかりませんでした」


SQLSERVERのログオンユーザーには2つあり、よく見るとDB用のユーザーはいたが、SQLSERVER用のユーザーは作っていなかった


1.MSMSのセキュリティタブにいるユーザー

2.MSMSのデータベースの下にいるユーザー


1がなかったためにログイン不可。

なのでさくっと作るのだが、このままだと終わらない。

次は1と2の紐付けをせねばいかん


参考ページ

http://d.hatena.ne.jp/fskkoba/20100401/1270097816

マッピングする初期DBないとこけます。

んで、紐付け作業をしていないと、マッピングの途中でユーザーが既に存在する、といわれるので、

use <database name>;
EXEC sp_change_users_login 'Update_One','<database user name>','<login name>'
GO

はやらなければなりません

なんとしょぼい内容で数時間詰まったんだろうorz


諸事情により、ぐりもんを弄ることになった。

というか弄くらざるを得ない状況になったというか。
そしたらもうJQueryがないと生きていけない身体になっていることに気がついた

いまさらもう素のAjaxなんてかけないー!
昔はprototypeすっげえええええ!なんていっていたのに

javascriptは変数の扱いが難しい
気を抜くとグローバルに汚染される

今更のメモ
・Javascriptは同ドメインのデータしか拾えない→セキュリティのため
・ぐりもんはグローバル変数は使えないっぽい→セキュリティのため
・何かをダウンロードさせる仕組みは無理(CSV吐くとか)→セキュリティのため
・通常JSならFirebugがあるがぐりもんになると、alertで吐くしかなくなる。が、GM_logなどを使えばログに吐ける
・Firebugのスクリプトのログはコピペすると改行消える。1行コマンドで、Copyっていうのがあるらしいのをネットで発見したが、今のAPIリスト見ると消えているような…なくなったのか?
・requireは初回のぐりもんインストールの時しか見ないので、変更、追加したければインストールしなおす
・クリップボードにあれこれするプログラムは不可→セキュリティのため
・JQueyでonreadyでclickイベントを定義する場合、クリック時の中身は別関数に置くべし。

なにいまさらpgrなネタですが、初めてのぐりもんなのでこんなもの