SQL Browser の公開を開始しました。
Vectorさんには申請中ですが、公式ページ( http://sites.google.com/site/sqlbrowser/ )のほうで、一足早くダウンロード可能です。
いっぱい使ってもらってより良いソフトウェアにしていきたいと思っていますので、是非ご利用願いますm(_ _)m
SQL Browser というソフトウェアを開発しています。ベンダ製 .NET データプロバイダや ODBC.NETによる ODBC 接続で、SQLの実行や一覧の取得が可能です。ブログにて開発履歴や課題などを書いていきます。
2010年6月22日火曜日
2010年6月18日金曜日
数値の取り扱い
現在、ほぼ最終段階(公開予定 7月1日)まで開発が進んでいます。
・・が、数値の取り扱いに頭を悩ましています。
例えば Oracle で NUMBER(10, 4) で定義されているフィールドがあるとします。
結果画面でデータの入力が可能になっていますが、そこで "123456.12345" と小数点の桁あふれが発生する数値を入力します。
手持ちの Oracle.DataAccess だと、自動で四捨五入が行なわれ、結果としては "123456.1235" となります。
値の設定は System.Data.Common.DbParameter 任せにしているため、小数点の桁数の管理など行なっていないがために発生している問題です。
また、例えば NUMBER(38, 0) で定義されているフィールドがあるとします。
このように桁が大きい場合、OCI-22053 が発生し、データ表示が行なえません。
桁の大きい数値を取り扱うとき、は OracleDataReaderクラスの、GetOracleDecimal などを利用しないといけないようです。
と、問題点をつらつらと書きましたが、プロバイダ依存の要素が強く、且つ、すべてのプロバイダでテストすることは不可能なため、現在は制限事項とするしかないかと考えていますm(_ _)m
・・が、数値の取り扱いに頭を悩ましています。
例えば Oracle で NUMBER(10, 4) で定義されているフィールドがあるとします。
結果画面でデータの入力が可能になっていますが、そこで "123456.12345" と小数点の桁あふれが発生する数値を入力します。
手持ちの Oracle.DataAccess だと、自動で四捨五入が行なわれ、結果としては "123456.1235" となります。
値の設定は System.Data.Common.DbParameter 任せにしているため、小数点の桁数の管理など行なっていないがために発生している問題です。
また、例えば NUMBER(38, 0) で定義されているフィールドがあるとします。
このように桁が大きい場合、OCI-22053 が発生し、データ表示が行なえません。
桁の大きい数値を取り扱うとき、は OracleDataReaderクラスの、GetOracleDecimal などを利用しないといけないようです。
と、問題点をつらつらと書きましたが、プロバイダ依存の要素が強く、且つ、すべてのプロバイダでテストすることは不可能なため、現在は制限事項とするしかないかと考えていますm(_ _)m
2010年6月16日水曜日
ソフトウェアのページ
Google Sites (Google サイト)にて SQL Browser 用のページを作成しました。
http://sites.google.com/site/sqlbrowser/
このブログも引き続き更新履歴や技術情報をお届けしますが、ソフトウェアの概要や、ダウンロード、問い合わせなど、総合的なページが必要だと思ったためです。
まだ情報量が少ないですが、今後充実させていきますので、是非ごらんくださいm(_ _)m
http://sites.google.com/site/sqlbrowser/
このブログも引き続き更新履歴や技術情報をお届けしますが、ソフトウェアの概要や、ダウンロード、問い合わせなど、総合的なページが必要だと思ったためです。
まだ情報量が少ないですが、今後充実させていきますので、是非ごらんくださいm(_ _)m
SQL整形ライブラリ(SqlFormatter)公開のお知らせ
先日のブログでお伝えしたとおり、SQL整形ライブラリ(SqlFormatter)の単独公開を開始しました。
Vector さんでダウンロードできますので、是非お試しくださいm(_ _)m
<SqlFormatter>
http://www.vector.co.jp/soft/win95/business/se484189.html
<SqlFormatterのサンプル>
http://www.vector.co.jp/soft/winnt/business/se484190.html
Vector さんでダウンロードできますので、是非お試しくださいm(_ _)m
<SqlFormatter>
http://www.vector.co.jp/soft/win95/business/se484189.html
<SqlFormatterのサンプル>
http://www.vector.co.jp/soft/winnt/business/se484190.html
2010年6月8日火曜日
PropertyGrid
このソフトウェアはデータベースに接続するので、もちろん「データベース接続設定」ダイアログが存在します。
DbConnectionStringBuilder のインスタンスを、PropertyGrid コントロールの SelectedObject プロパティに設定し、はい!完成っ!と、、暫く放置していました。
・・が、よく眺めてみると、Password (または pwd) は「***」とマスクが掛かっているのですが、ConnectionString が表示されていて、そこのパスワードは丸見え(x_x)
パスワードにマスクが掛かっている意味がない。。
設定ファイルを暗号化して保存している意味がない。。。
と、いうことで、PropertyGrid と格闘すること数時間、無事 ConnectionString を非表示にすることができましたので、以下、ソースコード。
PropertyGridの代わりに、以下のCustomPropertyGrid を使えばOKです。
// >> ここから -----------------------------------------------------------------
/// <summary>
/// カスタムプロパティグリッドです。
/// </summary>
public class CustomPropertyGrid : PropertyGrid
{
/// <summary>
/// プロパティタブを生成します。
/// </summary>
/// <param name="tabType">タブタイプ。</param>
/// <returns>プロパティタブ。</returns>
protected override PropertyTab CreatePropertyTab(Type tabType)
{
return new CustomPropertyTab();
}
}
/// <summary>
/// カスタムプロパティタブです。
/// </summary>
public class CustomPropertyTab : PropertyTab
{
/// <summary>
/// プロパティのコレクションを取得します。
/// </summary>
/// <param name="component">対象のコンポーネント。</param>
/// <param name="attributes">属性。</param>
/// <returns>プロパティのコレクション。</returns>
public override PropertyDescriptorCollection GetProperties(object component, Attribute[] attributes)
{
PropertyDescriptorCollection properties;
if (attributes != null)
{
properties = TypeDescriptor.GetProperties(component, attributes);
}
else
{
properties = TypeDescriptor.GetProperties(component);
}
PropertyDescriptorCollection collection = new PropertyDescriptorCollection(null);
foreach (PropertyDescriptor desc in properties)
{
// ConnectionString は追加しない
if (desc.Name == "ConnectionString")
{
continue;
}
collection.Add(desc);
}
return collection;
}
/// <summary>
/// タブ名を取得します。
/// </summary>
public override string TabName
{
get
{
return "CustomPropertyTab";
}
}
/// <summary>
/// ビットマップを取得します。
/// </summary>
public override Bitmap Bitmap
{
get
{
return new Bitmap(16, 16);
}
}
}
// << ここまで -----------------------------------------------------------------
DbConnectionStringBuilder のインスタンスを、PropertyGrid コントロールの SelectedObject プロパティに設定し、はい!完成っ!と、、暫く放置していました。
・・が、よく眺めてみると、Password (または pwd) は「***」とマスクが掛かっているのですが、ConnectionString が表示されていて、そこのパスワードは丸見え(x_x)
パスワードにマスクが掛かっている意味がない。。
設定ファイルを暗号化して保存している意味がない。。。
と、いうことで、PropertyGrid と格闘すること数時間、無事 ConnectionString を非表示にすることができましたので、以下、ソースコード。
PropertyGridの代わりに、以下のCustomPropertyGrid を使えばOKです。
// >> ここから -----------------------------------------------------------------
/// <summary>
/// カスタムプロパティグリッドです。
/// </summary>
public class CustomPropertyGrid : PropertyGrid
{
/// <summary>
/// プロパティタブを生成します。
/// </summary>
/// <param name="tabType">タブタイプ。</param>
/// <returns>プロパティタブ。</returns>
protected override PropertyTab CreatePropertyTab(Type tabType)
{
return new CustomPropertyTab();
}
}
/// <summary>
/// カスタムプロパティタブです。
/// </summary>
public class CustomPropertyTab : PropertyTab
{
/// <summary>
/// プロパティのコレクションを取得します。
/// </summary>
/// <param name="component">対象のコンポーネント。</param>
/// <param name="attributes">属性。</param>
/// <returns>プロパティのコレクション。</returns>
public override PropertyDescriptorCollection GetProperties(object component, Attribute[] attributes)
{
PropertyDescriptorCollection properties;
if (attributes != null)
{
properties = TypeDescriptor.GetProperties(component, attributes);
}
else
{
properties = TypeDescriptor.GetProperties(component);
}
PropertyDescriptorCollection collection = new PropertyDescriptorCollection(null);
foreach (PropertyDescriptor desc in properties)
{
// ConnectionString は追加しない
if (desc.Name == "ConnectionString")
{
continue;
}
collection.Add(desc);
}
return collection;
}
/// <summary>
/// タブ名を取得します。
/// </summary>
public override string TabName
{
get
{
return "CustomPropertyTab";
}
}
/// <summary>
/// ビットマップを取得します。
/// </summary>
public override Bitmap Bitmap
{
get
{
return new Bitmap(16, 16);
}
}
}
// << ここまで -----------------------------------------------------------------
2010年6月3日木曜日
SQL整形
思い立った(他の開発が疲れたとき(^x^))とき、SQL整形の機能を強化しています。
これまた奥の深い世界で、SQLを書く人により流儀やお作法があります。
C# や Java のようにコーディング規約に従って記述することは稀で、少なくとも僕の経験の範囲では、一度も見かけたことがないという・・
※パフォーマンスに考慮して、ウンタラ・・はもちろんありますが。。
例えば、SELECT文の項目の区切りであるカンマ(,)、皆さんはどこに付けますか?
<Aさん>
SELECT
COL1, -- カンマを後に付ける派
COL2
FROM
TABLE1
<Bさん>
SELECT
COL1
,COL2 -- カンマを前に付ける派
FROM
TABLE1
ちなみに僕はAさんと同じで、後ろに付けるタイプです。
この他にも、AND の位置や、JOIN、UNION と流儀を上げだしたら、きりがありません。
そしてすべての流儀に合わせて整形エンジンを組むのはかなり困難です(T^T)
メインの流儀はオプションで設定できるようにしていくつもりですが、そもそもSQLは、自然言語に近く整形が困難な言語ですので、どこまで作り込める(やる気になる)か。。
もう少し精度が上がったら、SQLの整形エンジン自体を、オープンソースか.NET DLLで再利用可能な形で公開しますので、使って頂いて色々叩いてもらいたいなぁと思っています。
さて、話は変わって最後に本日苦労したところ。
<通常のINSERT>
INSERT INTO
TABLE1
(
COL1,
COL2
)
VALUES
(
'AAA',
'BBB'
)
<SELECT INSERT>
INSERT INTO
TABLE1
SELECT
COL1,
COL2
FROM
TABLE2
何故、INSERTで違う記述を可能にしたんだ、ANSIめ(ToT)
これまた奥の深い世界で、SQLを書く人により流儀やお作法があります。
C# や Java のようにコーディング規約に従って記述することは稀で、少なくとも僕の経験の範囲では、一度も見かけたことがないという・・
※パフォーマンスに考慮して、ウンタラ・・はもちろんありますが。。
例えば、SELECT文の項目の区切りであるカンマ(,)、皆さんはどこに付けますか?
<Aさん>
SELECT
COL1, -- カンマを後に付ける派
COL2
FROM
TABLE1
<Bさん>
SELECT
COL1
,COL2 -- カンマを前に付ける派
FROM
TABLE1
ちなみに僕はAさんと同じで、後ろに付けるタイプです。
この他にも、AND の位置や、JOIN、UNION と流儀を上げだしたら、きりがありません。
そしてすべての流儀に合わせて整形エンジンを組むのはかなり困難です(T^T)
メインの流儀はオプションで設定できるようにしていくつもりですが、そもそもSQLは、自然言語に近く整形が困難な言語ですので、どこまで作り込める(やる気になる)か。。
もう少し精度が上がったら、SQLの整形エンジン自体を、オープンソースか.NET DLLで再利用可能な形で公開しますので、使って頂いて色々叩いてもらいたいなぁと思っています。
さて、話は変わって最後に本日苦労したところ。
<通常のINSERT>
INSERT INTO
TABLE1
(
COL1,
COL2
)
VALUES
(
'AAA',
'BBB'
)
<SELECT INSERT>
INSERT INTO
TABLE1
SELECT
COL1,
COL2
FROM
TABLE2
何故、INSERTで違う記述を可能にしたんだ、ANSIめ(ToT)
2010年6月2日水曜日
スタートページを追加しました
SQL Browser の開発状況です。
基本機能はおおむね実装が完了し、現在は使い勝手や例外処理の見直しの最中です。
「やっぱり SQL整形(崩し)は欲しいよね。。」
「使ったファイルの履歴があったほうが便利だなぁ」
など、自己満足(?)で機能追加をしています。
さて、このアプリはもともとデータベースに接続ありきで開発を進めていました。
SQL整形などの機能追加により、接続していないでも使うケースあるよね。。
ということで、データベースに接続していない状態も管理する必要が出てきました。
修正は大変でしたが、何とか完成。
ただし、データベースに接続していないと、初期表示が何もないさびしい画面に。。
そこで、VS風のスタートページを作ってみました。
どうですかね?
基本機能はおおむね実装が完了し、現在は使い勝手や例外処理の見直しの最中です。
「やっぱり SQL整形(崩し)は欲しいよね。。」
「使ったファイルの履歴があったほうが便利だなぁ」
など、自己満足(?)で機能追加をしています。
さて、このアプリはもともとデータベースに接続ありきで開発を進めていました。
SQL整形などの機能追加により、接続していないでも使うケースあるよね。。
ということで、データベースに接続していない状態も管理する必要が出てきました。
修正は大変でしたが、何とか完成。
ただし、データベースに接続していないと、初期表示が何もないさびしい画面に。。
そこで、VS風のスタートページを作ってみました。
どうですかね?
登録:
投稿 (Atom)