C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 107 を表示中)
■63606 / )  Re[2]: テーブルインデックスのUNIQUE情報取得
□投稿者/ asuka (9回)-(2012/09/12(Wed) 13:44:37)
2012/09/12(Wed) 14:15:26 編集(投稿者)
2012/09/12(Wed) 13:45:00 編集(投稿者)

No63605 (shu さん) に返信
レスありがとうございます。

>>string[] restrictionValues = new string[] { null, null, "TableName", null };
> 数が足りないしテーブル名はIndex=4に指定しないと駄目なはず。
今までもGetSchema自体はよく使っていまして、実際これでループで回していますが、
3番目に指定したテーブルのインデックス名は取得出来てはいます。
※row["TABLE_NAME"]は指定しているので変わらずインデックスの個数分ループします。


>>DataTable tbl = con.GetSchema("Indexes", restrictionValues);
>>foreach (DataRow row in tbl.Rows)
>>{
>> string str = string.Format("{0,10}\t{1,15}\t{2,7}\t{3,20}\t{4,5}",
>> row["TABLE_NAME"], row["INDEX_NAME"], row["UNIQUE"], row["COLUMN_NAME"]);
> Formatのインデックスと引数の数があっていませんが大丈夫でしょうか?

こちらは掲載ミスでした、間際らしくてすみません。
特に問題ないです。


>>これを行うとUNIQUEを指定した段階で例外が発生します。
>>その他の値は取れます。
> TableNameという名のインデックスが存在しているのでしょうか?
> 例外はなんでしょう?

TableNameという名前のテーブルの、GetSchemaの第一引数で指定したもの(Indexes)の、
スキームを取得する、といった意図になるかと思っています。
問題は、インデックスのスキームを取得しているのに「一意」かどうかの情報の取り方が分からない、といったところです。
今思うに、GetSchemaではクラスタ化かどうかまでは分かりますが、「一意」情報は分からないという決断に達しました。
※クラスタ化の場合row["CLUSTERD"]で文字列が取得出来ます。

このように考えたのは、rowのItemArrayの各配列は予約された文字列から取得することが出来ますが、
実際添え字の中身を直接デバッグで見てみるとboolの値がなく、一意かどうかの情報もなさそうだからです。
ItemArray {object[8]} object[]
[0] "DBNAME" object {string}
[1] "dbo" object {string}
[2] "INDEXNAME" object {string}
[3] "DGNAME" object {string}
[4] "dbo" object {string}
[5] "TableName" object {string}
[6] "INDEXNAME" object {string}
[7] "NONCLUSTERED" object {string}
※内容は変更しています。

例外は以下のように出ます。
「 列 'UNIQUE' はテーブル Indexes に属していません。」

返信 編集キー/


管理者用

- Child Tree -