2010年5月25日火曜日

ConnectionクラスのGetSchemaメソッド

テーブル一覧やビューの一覧の表示ですが、ConnectionクラスのGetSchemaメソッドを使用しています。

このメソッドが曲者で、System.Data.DataTable を返す仕様となっています。

型付ではなく、データプロバイダ任せになっているため、テーブル名を取得するだけでも一苦労掛かります。。
※列名が TableName だったり、TABLE_NAME だったり・・。

また、一覧表示では、TABLE_NAME より テーブル名 と表示されているほうが、分かり易いと思いますので、GetSchemaメソッドの結果を日本語化する必要があります。

辞書ファイルによるマッチング処理を行っていますが、データプロバイダ全てを網羅するのはかなり厳しいと思っています。

どこかに一覧とか公開してませんかね・・(T^T)

2010年5月15日土曜日

外部コンポーネント その1

ソフトウェアをすべて始めから開発するのは非常に大変です。
なので、オンラインリソースを参照したり、無償・有償に限らず外部コンポーネントを利用するのが、一般的な開発スタイルとなっています。

SQL Browser の開発でも類に漏れず、外部コンポーネントをいくつか利用しています。

その中で、今回は DockPanel Suite を紹介します。このコンポーネントは、Visual Studio のツールボックスのようなドッキングウィンドウを実現するためのものです。

フリーで提供されていて、しかもオープンソース(C#)のため、独自の改良も可能です。
また、サンプルソースも充実していますので、やり方がわからず困ることは少ないと思います。

と、いうわけで、非常にお勧めなコンポーネントなのですが、DockPanel_2_3_1_Soruce.zip のバージョンでは、日本語を利用した場合に問題があります。

ドッキングで隠れているとき、タブ表示されますが、文字が切れてしまいます。
また、Visual Studio と異なり、縦書き表示になります。















ソースをざっと眺めてみたら、VS2005AutoHideStrip.cs の 354行目~357行目 に問題があることが分かりました。

if (dockState == DockState.DockLeftAutoHide dockState == DockState.DockRightAutoHide)
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabVertical);
else
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabHorizontal);

DrawString でタブの文字を描画しているのですが、StringFormatTabVertical で縦書きになっています。
また、その前の 277行目~279行目 でタブの幅を算出しています。

int width = imageWidth + ImageGapLeft + ImageGapRight +
    TextRenderer.MeasureText(tab.Content.DockHandler.TabText, TextFont).Width +
    TextGapLeft + TextGapRight;

ここで、縦書きを考慮していないため、文字が切れてしまう訳です。
Visual Studio に合わせたいので、354行目~357行目 をコメントアウトして、「横書きのまま、90度回転させて描画」という修正を行うことにします。

// if (dockState == DockState.DockLeftAutoHide dockState == DockState.DockRightAutoHide)

//     g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabVertical);
// else
//     g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabHorizontal);

if (dockState == DockState.DockLeftAutoHide dockState == DockState.DockRightAutoHide)
{
    Rectangle rectText2 = rectText;
    rectText2.X = 0;
    rectText2.Y = 0;
    rectText2.Width = rectText.Height;
    rectText2.Height = rectText.Width;
    float originOffsetX = g.Transform.OffsetX;
    float originOffsetY = g.Transform.OffsetY;
    // g.TranslateTransform(rectText.Width, rectText.Y); 2010/08/05 バグ修正
    g.TranslateTransform(rectText.X + rectText.Width, rectText.Y);
    g.RotateTransform(90F);
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText2, StringFormatTabHorizontal);
    g.TranslateTransform(originOffsetX, originOffsetY);
}
else
{
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabHorizontal);
}

と、いうわけで、無事に表示されるようになりました(^o^)/















<2010/08/05 追記>

ついでにパネルが左右に表示されているとき、Visual Studio 風にアイコンを90度回転するソースもご紹介します。
同じく VS2005AutoHideStrip.cs の 344行目 をコメントアウトして、以下の修正を行ってください。

Bitmap bmp = ((Form)content).Icon.ToBitmap();

if ((dockState == DockState.DockLeftAutoHide) || (dockState == DockState.DockLeft)
    (dockState == DockState.DockRightAutoHide) || (dockState == DockState.DockRight))
{
    bmp.RotateFlip(RotateFlipType.Rotate270FlipX);
}
g.DrawImage(bmp, RtlTransform(rectImage, dockState));
bmp.Dispose();
bmp = null;
// g.DrawIcon(((Form)content).Icon, RtlTransform(rectImage, dockState));

ソフトについて

今回は、ソフトウェアの主な機能を箇条書きします。

<主な機能>
 ・ADO.NET にてデータベースに接続する。
 ・各種クエリーがトランザクション実行可能。
 ・選択クエリー(SELECT)の結果をグリッド形式の表で表示。
 ・クエリーのファイル保存が可能。
 ・DBオブジェクト(テーブルやビュー)をリスト表示可能。

…うーむ、機能だけだと特徴なさすぎですね(^o^;)

皆さんにお使いいただけるよう、アピールをしなくては。。

と、いうことで。
アピールポイントの1つにプレビュー表示があります。
プレビュー機能がある類似ソフトって意外と少ないです。

データを確認する必要があるとき、「SELECT * FROM TABLE1」みたいな SQL で、いきなり実行してしまうことが間々あります。

ところが思っていたよりデータ件数が多く、なかなか結果が表示されず、イライラすることも、しばしば・・。

そんな理由でプレビューはどうしてもつけたかった機能です。

2010年5月8日土曜日

開発ブログ公開します!

はじめまして。開発者の taka です。
SQL Browser というソフトウェアを開発しています。


利用してくださる方はもちろん、.NET Framework開発者の方もオンラインリソースとして使えるような情報が書けたらと思いますので、よろしくお願いしますm(_ _)m