2009/04/19

[C#]Update, Insert, Batそれぞれを生成

簡単なUpdate文、Insert文、それらを実行するBat、それらのBatをまとめて実行するBatを生成。
厳密なものじゃないです。Update文とかWhere条件はANDだけ(笑

ソースはここ

WS0679

事前にXMLでCSVのカラム番号とテーブルのカラム名を対応付けておいて、インポートみたいな。
  • XML:PairsでCSVのインデックスとテーブルのカラム名を対応付ける
  • XML:KeysでテーブルのキーカラムとCSVのキーインデックスを対応付ける
  • XML:ConfigでPairs、Keys、CSVファイル、テーブル名を設定
  • 設定はPairクラスの配列をシリアライズ/デシリアライズ(XmlSerializer)

できることは
  • CSVをDBにInsert
  • CSVを元にDBをUpdate
  • CSVを元にInsert文生成
  • CSVを元にUpdate文を生成
  • それらのInsert文やUpdate文のスクリプトを実行するBatを作成
  • それらのBatをまとめて実行するBatを作成

残念ながらこれもソースを全て公開できる状態ではないので一部をうp・・・。
そうはいってもほとんど入ってるけど。


Windows DOS/コマンドプロンプト辞典OBA開発入門 OfficeとSharePoint Server 2007の連携によるビジネスアプリケーション構築 (マイクロソフト公式解説書)VSTOとSharePoint Server 2007による開発技術 Visual Studio 2008で構築するOBAソリューション (Programmer’s SELECTION)絶対現場主義Visual C#実践講座―開発の現場から生まれた実践テクニック&TIPS集

[C#]TableVisitor

別にデザパタのVisitorパターンを使っているわけではない。

指定したDBの中を歩き回るイメージだから。

指定したDB内のテーブル中を見て周り、指定したカラムの値を調べる。該当したテーブルを一覧で絞り込むっていうツール。

 

ゴミデータ探しのために作りました。

ソースはここ。C#1.1。

 

WS0673

 

これもだいぶ前に作った。たぶん1年位前。

 

DB内のテーブル一覧を取得するクエリ。(面倒くさいのでそのまま)

SELECT
  Cols.TABLE_SCHEMA AS Owner,
  Cols.TABLE_CATALOG AS DB,
  Tables.NAME AS TableName,
  Tables.crdate AS CreatedDate,
  Cols.ORDINAL_POSITION AS ColumnNo,
  Cols.COLUMN_NAME AS ColumnName,
  Cols.DATA_TYPE AS DataType,
  Cols.CHARACTER_MAXIMUM_LENGTH AS CharactorLength,
  Cols.NUMERIC_PRECISION AS NumberLength,
  Cols.COLUMN_DEFAULT AS DefaultValue,
  Cols.IS_NULLABLE AS NullAble
FROM
  SYSOBJECTS AS Tables
INNER JOIN
  INFORMATION_SCHEMA.COLUMNS AS Cols
ON
  Tables.NAME = Cols.TABLE_NAME
WHERE
  Tables.TYPE <> 'V'
AND
  Tables.NAME <> 'dtproperties'
ORDER BY
  Cols.TABLE_SCHEMA,
  Cols.TABLE_CATALOG,
  Tables.NAME,
  Tables.TYPE,
  Cols.ORDINAL_POSITION

[C#][デザパタ]Composite,Visitor,Template Method, Builder

なんかその辺のデザパタを結構使ってある。アンチパターンになり気味。なってるのかも。Fat Interface化してる。コード見たらわかると思いますがかなり雑で恥ずかしいです;;意味不明なコードもあると思います。

まぁでも取り合えずさらしてみます。

 

Valvallow.Components

ソースはここ。(一部)(C#1.1)

 

テスト用、デモ用の画面たち↓

 

メニュー

WS0664

 

XMLからDB用のマスターレコード生成。

WS0665

 

XMLを↑の機能でDBに取り込んで、さらにそのDBのデータからXMLを復元したの図。左が元のXML、右がDBから復元したXML

WS0666

 

XMLから作ったComposite内をVisitorが歩き回る様を可視化したかったの図。左のツリーの黄色がVisitor。

WS0667

 

XMLからコメントを削除してXMLに保存したいの図。

WS0668

 

これもXMLからDBのマスター用のレコードを生成したい画面の図。

WS0669

 

DBにSQLを発行して、取得されたレコードからXMLを作ったの図。

WS0670

 

内容

  • AbstractComposite
  • AbstractCompositeCombinator
  • Composite
  • CompositeCollection
  • CompositeCombinator
  • CompositeEventArgs
    CompositeType
  • IComposite
    ICompositeCombinator
  • IVisitable
  • Leaf
  • AbstractCompositeBuilderComposite
  • TreeViewBuilder
  • Director
  • IBuilder
  • ICompositeBuilder
  • IDirector
  • TableCompositeBuilder
  • XmlCompositeBuilder
  • XmlDocumentBuilder
  • XmlTreeViewBuilder
  • AbstractCompositeVisitor
  • CompositeViewer
  • CompositeVisitorEventArgs
  • ICompositeVisitor
  • IVisitor
  • VisitEndTransaction
  • XmlEntry
  • AbstractEntry
  • IEntry
  • RecordEntry

[C#]GraphicGenerator(認証画像ジェネレータ)

WS0654
WS0662
WS0663
WS0655
WS0657
WS0658
WS0659
WS0660
WS0661

C#1.1です。
認証画像をジェネレートするサンプルです。
やっとOOPが少しわかり始めた頃に作りました。これは去年の夏くらいだったと思います。

Decoratorパターンに近い設計です。(これを書いた頃はデザパタ勉強中だったけど、Decoratorはまだ知らなかった)
これについては理由あってソース全ては公開できません^^;
一部のソースはここ

UML(書き方はあまりわからないけど、設計時に書いてみたw)
GraphicGenerator

  • エフェクトを追加したいときはIEffectorを実装したクラスを追加すればいい
  • データソースを変えたければIStringSourceを実装したクラスと挿げ替えてやればいい(ポリモーフィズム)
  • 正解を導きだす方法を変えたければIAnswerを実装したクラスと挿げ替えてあげればいい
    • という点ではStrategyチック(?)

インターフェース名を見れば大体どんな作りかわかるかも。
  • IGraphicGenerator
    • ICanvas Canvas { get; }
    • IStringSource Source { get; }
    • IEffector[] Effectors { get; }
    • ICanvas Generate();
  • IEffector
    • ICanvas Effect(ICanvas c);
  • ICanvas
    • Brush[] BrushArray { get; }
    • Rectangle PaintAngle { get; }
    • Graphics Canvas { get; }
    • Image Image { get; }
    • Size Size { get; }
    • Image Draw(string s);
  • IStringSource
    • int Length { get; }
    • string[] Values { get; }
    • string this[int Index] { get; }
    • void Make();
    • string String { get; }
    • IAnswer Answer { get; }
  • IAnswer
    • string[] Sourceis { get; }
    • string CorrectAnswer { get; }
    • string Make(params string[] Sourceis);
    • bool IsMatch(string Answer);

一部のソースはここ



絶対現場主義Visual C#実践講座―開発の現場から生まれた実践テクニック&TIPS集C#クックブック 第3版増補改訂版Java言語で学ぶデザインパターン入門

[Excel][C#]指定したカラムに連番を書き込む

指定したカラムに連番を書きこむ。ただし、もう一つ指定したカラムの値が変わったらまた1から振りなおす。ってな感じでエクセルを編集したかったので。
で書いたやつをちょっと書き直しただけ。
ソースはここ

using System;
using Microsoft.Office;
using Microsoft.Office.Core;
using Excel;
namespace Sample
{
    /// <summary>
    /// Class1 の概要の説明です。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //こういうときローカル(関数内)関数欲しいよなー。
            //C#1.1でスマソ。
            //っつかλ欲しい。
            string path = 0 < args.Length ? args[0] : null;
            int keyCellIndex = 1 < args.Length ? int.Parse(args[1]) : 1;
            int countCellIndex = 2 < args.Length ? int.Parse(args[2]) : 1;
            int rowLimit = 3 < args.Length ? int.Parse(args[3]) : 0;
            Application app = new Excel.ApplicationClass();
            Workbook wb = app.Workbooks.Open(path
                ,Type.Missing, Type.Missing, Type.Missing
                ,Type.Missing, Type.Missing, Type.Missing
                ,Type.Missing, Type.Missing, Type.Missing
                ,Type.Missing, Type.Missing, Type.Missing
                ,Type.Missing, Type.Missing);
            wb.Application.Visible = true;
            Worksheet ws = (Worksheet)wb.ActiveSheet;
            for (int i = 1, j = 0, preCellValue = 0; i <= rowLimit; i++)
            {
                int cellValue = int.Parse((((Range)ws.Cells[i, keyCellIndex]).Text).ToString());
                if (preCellValue != cellValue)
                {
                    j = 0;
                    preCellValue = cellValue;
                }
                ws.Cells[i, countCellIndex] = ++j;
            }
            wb.Save();
            app.Quit();
        }
    }
}

OBA開発入門 OfficeとSharePoint Server 2007の連携によるビジネスアプリケーション構築 (マイクロソフト公式解説書)VSTOとSharePoint Server 2007による開発技術 Visual Studio 2008で構築するOBAソリューション (Programmer’s SELECTION)OBA実践講座 Excel 2007とSharePoint Server 2007によるデータ連携 (マイクロソフト公式解説書)

[C#]FileRemover

コンソールツール。

毎度のごとくC#1.1。

 

自分と同階層以下のディレクトリ内に、事前にXMLで指定しておいた拡張子のファイルがあったら削除し、ログを吐くというちょっとしたツール。

 

自由自在にLLを使えればC#で作る必要もないのだろうけども。早くScheme(Gauche)を自由自在に使えるようになりたいもんだ。

 

ソースはここ

[C#][MSSQL]ColumnDataConverter

WS0653

名前ほど大したことはしません。これも仕事で必要にせまられて・・・。

指定したDBの指定したカラムのデータを全角/半角に、またはカタカナ/ひらがなに、変換するだけという・・・。なんともお粗末なもの。

 

ソースはここ

[C#]XmlViewer

WS0649

WS0651

C#1.1。

これは2.0だ。

ソースはここ

 

初めてXMLを扱うことになったときにサンプルで作りました。仕事でね。

[C#]TableDataConverter

WS0648

自分の仕事用に作ったツール。作ったのは去年の今頃かな。

指定したDBの指定したテーブルたちのデータを、これまた指定したDBの指定したテーブルにそっくりそのまま移すためのツール。

C#1.1。

仕事でMSSQLで開発してたんだけど、急遽MySQLもサポートすることになって、大量のマスターテーブルのデータをどうやって納品用のDBに突っ込もうかなーと考えて作りました。ちなみにテーブルの構造が同じでないと移行できません。

一応指定したテーブルのデータ削除(Trancate)もできます。

 

ソースはここ

 

プロジェクトごとLZHで置いてます。ソースはすこぶる汚いですが、何かの参考になれば幸い。まぁいまさら1.1なんて需要なさすぎでしょうけども。

[C#]Enterフォーカス遷移をどうにかしたいなーと

そう思って書いたのがこれでした。使い勝手は悪い。
ソースはココ
/// <summary>
/// フォーカス遷移機能を提供します。
/// ---Defined 2008/04/07
/// </summary>
public class ControlSelecter
{
    #region フィールドメンバ変数定義
    /// <summary>
    /// 対象フォーム格納メンバ
    /// </summary>
    private readonly Form TargetForm;
    /// <summary>
    /// 無視するコントロールのタイプを指定します。
    /// </summary>
    private readonly ArrayList IgnoreTypes;
    #endregion
    #region コンストラクタ
    /// <summary>
    /// コンストラクタ:デフォルト
    /// </summary>
    /// <param name="Target"></param>
    /// <param name="IgnoreControlTypes"></param>
    public ControlSelecter(Form Target, params Type[] IgnoreControlTypes)
    {
        this.TargetForm = Target;
        this.TargetForm.KeyPreview = true;
        this.IgnoreTypes = new ArrayList(IgnoreControlTypes);
    }
    /// <summary>
    /// コンストラクタ:オーバーロード
    /// </summary>
    /// <param name="Target"></param>
    public ControlSelecter(Form Target) : this(Target, new Type[]{}) {    }
    #endregion
    #region フォーカス遷移
    /// <summary>
    /// フォーカス遷移
    /// </summary>
    public virtual void Next(KeyEventArgs e)
    {
        //不正パラメータ検知
        if (this.TargetForm == null)
        {
            return;
        }
        if (e == null)
        {
            return;
        }
        if (!e.KeyCode.Equals(Keys.Enter))
        {
            return;
        }
        //アクティブコントロール取得
        System.Windows.Forms.Control ctl = this.TargetForm.ActiveControl;
        //コントロールチェック
        if (ctl == null)
        {
            return;
        }
        //フォーカス遷移
        this.TargetForm.SelectNextControl(ctl, !e.Shift, true, true, true);
        //アクティブコントロールを再取得
        ctl = this.TargetForm.ActiveControl;
        //再帰判定
        if (!this.CanSelect(ctl))
        {
            //再帰
            this.Next(e);
        }
        e.Handled = true;
    }
    #endregion
    #region フォーカス遷移可否判定
    /// <summary>
    /// フォーカス遷移可否判定
    /// </summary>
    /// <param name="ctl">対象コントロール</param>
    /// <returns>可否</returns>
    protected virtual bool CanSelect(System.Windows.Forms.Control ctl)
    {
        bool result = false;
        //nullチェック
        if (ctl == null)
        {
            return result;
        }
        //非表示は不可
        if (!ctl.Visible)
        {
            return result;
        }
        //使用不可は不可
        if (!ctl.Enabled)
        {
            return result;
        }
        //無視するコントロールかどうか判定
        if (this.IgnoreTypes != null)
        {
            if (this.IgnoreTypes.Contains(ctl.GetType()))
            {
                return result;
            }
        }
        return !result;
    }
    #endregion
}

絶対現場主義Visual C#実践講座―開発の現場から生まれた実践テクニック&TIPS集C#クックブック 第3版C#エッセンシャルズ 第2版